Italia
Foro

Erledigt: Firebird Embedded

 
- Page 1 -



Dietmar
Horn
Hallo zusammen,

mit meinem XProfan-Firebird-SQL-Projekt klappt es soweit ganz gut.

Nun gibt es aber ein Problem, welches ich possibile bis vorgestern mit XProfan lösen müßte, falls das mit XProfan aktuell überhaupt possibile ist.

In der ersten offiziellen Beta per ausgesuchte Tester soll das Programm nun unbedingt als Embedded-Variante laufen, und nicht als Nicht-Embedded.

Mit Nicht-Embedded circa ODBC-Schnittstelle mittels der normalen FB-SQL-Befehle klappt bisher alles weitestgehend tadellos.

Doch wie kann ich die Embedded-Variante initialisieren, um danach mit denselben SQL-Routinen im Programm wie gewohnt weiterarbeiten zu können? Später soll der Anwender dann zwischen beiden Varianten selber die Auswahl treffen.

Für die SQL-Experten unter euch habe ich schon mal alles in ein ZIP-Archiv gepackt - also Firbird embedded (keine Installation erforderlich) und einige zusätzliche Hilfedateien (außer die, welche im Unterordner doc sowieso schon vorhanden sind). Die beigelegte Patienten.fdb potuto zum Testen dienen.

Selber habe ich die paar laut Hilfedatei(en) benötigten File in das Projektverzeichnis kopiert und auch die fbembed.dll in fbclient.dll umbenannt. Laut Hilfedatei(en) sollte das ausreichen. Wie ich das bis jetzt verstehe, braucht man doch den Rest aus dem Firebird-Ordner aus dem ZIP doch gar nicht unbedingt, oder?

Doch mit
KompilierenMarkierenSeparieren
bekomme ich einfach keine Verbindung hin!

Wenn ich das in den nächsten Tagen (notfalls eben erst mal per Workarount) nicht irgendwie mit XProfan hinbekomme, dann kann ich die Arbeit von mehreren Monaten im Prinzip in die Tonne kloppen ...

Roland, hast Du vielleicht als Datenbank-Profi eine Lösung per dieses Problem, oder wer von den anderen DB-Profis kennt sich noch damit aus?

Saluto und Danke im voraus!

Dietmar

7.490 kB
Kurzbeschreibung: Firebird embedded
Hochgeladen:17.04.2009
Downloadcounter76
Download
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
17.04.2009  
 



 
- Page 1 -



RGH
Ciao,

hier ein erster Teil zur Verwendung von direktem Zugriff auf Firebird mittels XProfan. Das Beispiel sollte sowohl per die Client-Version (da è die DLL allerdings anders: fbclient.dll, bei Interbase naturalmente auch) als auch wie hier per die Embedded-Version funktionieren.

ACHTUNG: Das Beispiel funktioniert! Wenn man mit Ja antwortet wird die Datenbank tatsächlich gelöscht und beim Versuch, die nicht mehr vorhandene Datenbank zu schließen, gibt es die entsprechene Firebird-Fehlermeldung. ALso vorher bitte eine Sicherheitskopie der Datenbankdatei (im Beispiel Patienten.fdb) erstellen.

Was geschieht im Programm?
- Mit ImportDLL werden die API-Funktionen der DLL imortiert
- Mit isc_expand_dpb() wird der Verbindungsstring erzeugt. In unserem Fall brauchen wir nur Username und Paßwort. Die entsprechenden Konstanten kommen aus der ibase.h
- Mit isc_attach_database() wird die Verbindung zur Datenbank hergestellt. Wenn der erste Eintrag des Status-Arrays eine 1 ist, ist der zweite Eintrag im Falle ungleich 0 die Interbase-Fehlernummer. In diesem Fall wird mit isc_interprete() der text der entsprechenden Fehlermeldung ermittelt.
- mit isc_drop_database() können wir nun die Datenbank löschen. Das klappt naturalmente nur mit korrektem Usernamen und Paßwort. Ansonsten gibt es eine Fehlermeldung. (Das Löschen der Datenbank habe ich als praktischen Test per die erfolgreiche Verbindung gewählt, weil ein SELECT ein wenig komplexer wäre ... ;) ) Mit etwas Fleiß und Erfahrung kann man naturalmente mit den übrigen API-Funktionen auch SQL-Statements absetzen, BLOBs schreiben und lesen, etc. Die API erinnert ein wenig an die ODBC-API ... leider nur ein wenig.
- Mit isc_detach_database() wird die Verbindung zur Datenbank beendet ... vorrausgesetzt sie wurde im vorigen Schritt nicht gelöscht.

Das Beispiel beweist, was aber eh klar war: Wenn mit anderen Programmiersprachen der direkte Zugriff auf Firebird geht, geht es auch mit XProfan:
KompilierenMarkierenSeparieren
FireBird Embedded Demo
----------------------
©2009 Roland G. Hülsmann
Definitionen aus ibase.h
def &isc_dpb_user_name 28
def &isc_dpb_password 29
declare msg#
declare status_vector&[20]
declare pdpb&, pstatus&
var hdll& = ImportDLL(fbembed.dll, fb_)
dim msg#, 512
var dpb_length& = 0   Länge des Verbindungsstrings
var db1& = 0          Databasehandle
var user$ = SYSDBA
var pass$ = masterkey
var name$ = Patienten.fdb
cls
Verbindungsstring erstellen
fb_isc_expand_dpb(addr(pdpb&), addr(dpb_length&),
&isc_dpb_user_name, addr(user$),
&isc_dpb_password, addr(pass$),
0)

whileloop 0, dpb_length& - 1

    print hex$(byte(pdpb&,&loop));,;

endwhile

Verbindung zur Datenbank herstellen und auf Fehler prüfen
fb_isc_attach_database(addr(status_vector&[0]), len(name$), addr(name$), addr(db1&), dpb_length&, pdpb&)

if ((status_vector&[0] = 1) and status_vector&[1])

    pstatus& = addr(status_vector&[0])
    fb_isc_interprete(msg#, addr(pstatus&))
    messagebox(string$(msg#, 0), Firebird-Fehler, 16)
    end 1

endif

Hier könnte nun der Zugriff auf die Datenbank stattfinden ...
Im Beispiel wird die Datenbank gelöscht! (Vor dem Ausprobieren bitte Sicherheitskopie anlegen!)

if messageBox(Wollen Sie die Datenbank wirklich löschen?, Frage:, 36) = 6

    fb_isc_drop_database(addr(status_vector&[0]), addr(db1&))

    if ((status_vector&[0] = 1) and status_vector&[1])

        pstatus& = addr(status_vector&[0])
        fb_isc_interprete(msg#, addr(pstatus&))
        messagebox(string$(msg#, 0), Firebird-Fehler, 16)
        end 2

    endif

endif

Verbindung mit der Datenbank lösen und auf Fehler prüfen
fb_isc_detach_database(addr(status_vector&[0]), addr(db1&))

if ((status_vector&[0] = 1) and status_vector&[1])

    pstatus& = addr(status_vector&[0])
    fb_isc_interprete(msg#, addr(pstatus&))
    messagebox(string$(msg#, 0), Firebird-Fehler, 16)
    end 3

endif class=s4 href='./../../funktionsreferenzen/xprofan/end/'>end

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
20.04.2009  
 




Dietmar
Horn
Danke!

Das SQLInit und SQLDone hätten wir dann ja schon mal.

Wenn ich dann noch irgendwie das Äquivalent zu SQLExec per API mit den ganz normalen SQL-Übergabestrings (SELECT, INTO, UPDATE, etc.) hätte, dann wäre die Kuh ja erst mal fast vom Eis.

Saluto
Dietmar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
20.04.2009  
 




RGH
Dietmar Horn, Beitrag=51895, Zeitpunkt=20.04.2009
Danke!

Das SQLInit und SQLDone hätten wir dann ja schon mal.

Wenn ich dann noch irgendwie das Äquivalent zu SQLExec per API mit den ganz normalen SQL-Übergabestrings (SELECT, INTO, UPDATE, etc.) hätte, dann wäre die Kuh ja erst mal fast vom Eis.

Saluto
Dietmar


Nun denn! Das meiste geht schon. Aus Stabilire, die mir noch nicht bekannt sind, läßt sich kein Feld mit NUMERIC(10,2) definieren. NUMERIC(8,2) hingegen funktioniert. Und Felder, die mit NUMERIC(10,2) definiert sind, wie z.B. SALARY in EMPLOYEES erzeugen beim Zugriff lediglich eine Fehlermeldung. Und BLOBs gibt es auch noch nicht, dürften aber kein großes Problem sein.
KompilierenMarkierenSeparieren
FireBird Embedded Demo
----------------------
©2009 Roland G. Hülsmann
Definitionen aus ibase.h
def &isc_dpb_user_name 28
def &isc_dpb_password  29
def &SQLDA_VERSION1     1
def &DSQL_close         1
def &DSQL_drop          2
def &SQL_TEXT         452
def &SQL_VARYING      448
def &SQL_SHORT        500
def &SQL_LONG         496
def &SQL_FLOAT        482
def &SQL_DOUBLE       480
def &SQL_D_FLOAT      530
def &SQL_TIMESTAMP    510
def &SQL_BLOB         520
def &SQL_ARRAY        540
def &SQL_QUAD         550
def &SQL_TYPE_TIME		560
def &SQL_TYPE_DATE    570
def &SQL_INT64			  580
Weitere Definitionen
def &varchar  $1C0  448 SQL_VARYING NOT NULL
def &varchar2 $1C1  449             NULL ALLOWED
def &char     $1C4  452 SQL_TEXT    NOT NULL
def &char2    $1C5  453             NULL ALLOWED
def &float    $1E2  482 SQL_FLOAT   NOT NULL
def &float2   $1E3                  NULL ALLOWED
def &long     $1F0  496 SQL_LONG    NOT NULL
def &long2    $1F1  497             NULL ALLOWED
def &short    $1F4  500 SQL_SHORT   NOT NULL
def &short2   $1F5  501             NULL ALLOWED
def &date     $1FE  510 SQL_TIMESTAMP N NULL
def &date2    $1FF  511             NULL ALLOWED
def &blob     $208  520 SQL_BLOB    NOT NULL
def &blob2    $209  521             NULL ALLOWED
Strukturen aus ibase.h
struct XSQLVAR =
sqltype%,             00:datatype of field
sqlscale%,            02:scale factor
sqlsubtype%,	        04:datatype subtype - BLOBs & Text types only
sqllen%,			        06:length of data area
sqldata&,             08:address of data
sqlind&,              12:address of indicator variable (short)
sqlname_length%,      16:length of sqlname field
sqlname$(31),         18:name of field, name length + space for NULL
relname_length%,      50:length of relation name
relname$(31),	        52:fields relation name + space for NULL
ownname_length%,      84:length of owner name
ownname$(31),         86:relations owner name + space for  NULL
aliasname_length%,   118:length of alias name
aliasname$(31)        120:relations alias name + space for NULL -> 151 = 152 Bytes
struct XSQLDA =
version%,             00:version of this XSQLDA
sqldaid#(14),         02:for future use
sqln%,                16:number of fields allocated
sqld%                 18:actual number of fields
Weitere Strukturen
struct TIMEDATE =
sek&,                0 .. 59
min&,                0 .. 59
std&,                0 .. 23
tag&,                1 .. 31
mon&,                0 .. 11 !
jahr&,               Jahr - 1900 (109 = 2009)
wtag&,               Wochentag 0 .. 6, 0 = Sonntag
jtag&,               Tag im Jahr 0 .. 365
isdst&                Ungleich null bei US-Sommerzeitkonvertierung
Funktionen aus DLL importieren
var hdll& = ImportDLL(fbembed.dll, fb_)

proc fbError

    parameters sv&[]
    declare msg#
    dim msg#, 512
    var pstatus& = addr(sv&[0])
    var sqlcode& = fb_isc_sqlcode(addr(sv&[0]))

    if sqlcode& < 0  SQL-Fehlergefunden

        fb_isc_sql_interprete(sqlcode&, msg#, 512)

    else

        fb_isc_interprete(msg#, addr(pstatus&))

    endif

    if get(errorlevel) > 0

        messagebox(string$(msg#, 0), Firebird Fehler:, 16)
        end 1

    elseif get(errorlevel) = 0

        messagebox(string$(msg#, 0), Firebird Warnung:, 16)

    endif

endproc

proc fbInit

    parameters user$, pass$, name$
    declare status_vector&[20]
    var dpb_length& = 0   Länge des Verbindungsstrings
    var db1& = 0          Databasehandle
    var pdpb& = 0         Zeiger auf Verbindungsstring
    Verbindungsstring erstellen
    fb_isc_expand_dpb(addr(pdpb&), addr(dpb_length&),
    &isc_dpb_user_name, addr(user$),
    &isc_dpb_password, addr(pass$),
    0)
    Verbindung zur Datenbank herstellen und auf Fehler prüfen
    fb_isc_attach_database(addr(status_vector&[0]), len(name$), addr(name$), addr(db1&), dpb_length&, pdpb&)

    if ((status_vector&[0] = 1) and status_vector&[1])

        fbError(status_vector&[])

    endif

    return db1&

endproc

proc fbDone

    parameters db1&
    declare status_vector&[20]
    Verbindung mit der Datenbank lösen und auf Fehler prüfen
    fb_isc_detach_database(addr(status_vector&[0]), addr(db1&))

    if ((status_vector&[0] = 1) and status_vector&[1])

        fbError(status_vector&[])

    endif

endproc

proc fbDrop

    parameters db1&
    declare status_vector&[20]
    fb_isc_drop_database(addr(status_vector&[0]), addr(db1&))

    if ((status_vector&[0] = 1) and status_vector&[1])

        fbError(status_vector&[])

    endif

endproc

proc pad

    parameters s$, l&
    return left$(s$ + space$(l&), l&)

endproc

proc fbSQLExec

    parameters db1&, sql$, mode%
    declare status_vector&[20], trans&, stmt&
    declare osqlda#, osqlvar#, osql#, tm_date#
    var sqlcount& = 0
    dim osqlda#, XSQLDA
    dim osqlvar#, XSQLVAR
    dim tm_date#, TIMEDATE
    Transaktion starten
    fb_isc_start_transaction(addr(status_vector&[0]), addr(trans&), 1, addr(db1&), 0, 0)

    if trans& > 0

        Statementhandle holen

        if left$(upper$(trim$(sql$)),7) <> SELECT

            fb_isc_dsql_execute_immediate(addr(status_vector&[0]), addr(db1&), addr(trans&), len(sql$), addr(sql$), 1, 0)

            if ((status_vector&[0] = 1) and status_vector&[1])

                fbError(status_vector&[])

            endif

        else

            fb_isc_dsql_allocate_statement(addr(status_vector&[0]), addr(db1&), addr(stmt&))

            if stmt& > 0

                Datenbereich zunächst für das Lesen der ersten 2 Felder vorbereiten
                dim osql#, sizeof(osqlda#) + 2 * sizeof(osqlvar#)
                clear osql#
                osqlda# = addr(osql#)
                osqlda#.version% = &SQLDA_VERSION1
                osqlda#.sqln% = 2
                Informationen über erste 2 Felder holen (Datentyp, Länge, etc.)
                fb_isc_dsql_prepare(addr(status_vector&[0]), addr(trans&), addr(stmt&), len(sql$), addr(sql$), 1, osql#)

                if ((status_vector&[0] = 1) and status_vector&[1])

                    fbError(status_vector&[])

                endif

                var d% = osqlda#.sqld%

                if d% > 2

                    Wenn mehr als zwei Felder, dann Datenbereich für erittelte Feldanzahl neu dimensionieren
                    clear osql#
                    dim osql#, sizeof(osqlda#) + d% * sizeof(osqlvar#)
                    osqlda# = addr(osql#)
                    osqlda#.version% = &SQLDA_VERSION1
                    osqlda#.sqln% = d%
                    Informationen über alle Felder holen (Datentyp, Länge, etc.)
                    fb_isc_dsql_prepare(addr(status_vector&[0]), addr(trans&), addr(stmt&), len(sql$), addr(sql$), 1, osql#)

                    if ((status_vector&[0] = 1) and status_vector&[1])

                        fbError(status_vector&[])

                    endif

                endif

                Feldbeschreibungen füllen und Titelzeile erzteugen
                declare fname$[d%-1], ftyp%[d%-1], fstyp%[d%-1], flen%[d%-1], fscale%[d%-1], fdata$[d%-1]
                var zeile$ =
                var maxlen& = 0

                whileloop 0, d%-1

                    osqlvar# = addr(osql#) + sizeof(osqlda#) + &loop * sizeof(osqlvar#)
                    fname$[&loop]  = osqlvar#.sqlname$
                    flen%[&loop]   = osqlvar#.sqllen%
                    case len(fname$[&loop]) > flen%[&loop] : flen%[&loop] = len(fname$[&loop])
                    ftyp%[&loop]   = osqlvar#.sqltype%
                    fstyp%[&loop]  = osqlvar#.sqlsubtype%
                    case ftyp%[&loop] = &date  : flen%[&loop] = 10
                    case ftyp%[&loop] = &date2 : flen%[&loop] = 10
                    fscale%[&loop] = osqlvar#.sqlscale%
                    print osqlvar#.sqltype%, hex$(ftyp%[&loop]),fstyp%[&loop],fname$[&loop],flen%[&loop]
                    zeile$ = zeile$ + pad(fname$[&loop],flen%[&loop]) + |
                    case flen%[&loop] > maxlen& : maxlen& = flen%[&loop]

                endwhile

                Titelzeile ausgeben

                select mode%

                    caseof 0 : print zeile$

                    caseof 1 : addstring zeile$

                endselect

                Trennlinie erzeugen und ausgeben
                zeile$ =

                whileloop 0, d%-1

                    zeile$ = zeile$ + mkstr$(-,flen%[&loop]) + |

                endwhile

                select mode%

                    caseof 0 : print zeile$

                    caseof 1 : addstring zeile$

                endselect

                Statement ausführen
                fb_isc_dsql_execute(addr(status_vector&[0]), addr(trans&), addr(stmt&), 1, 0)

                if ((status_vector&[0] = 1) and status_vector&[1])

                    fbError(status_vector&[])

                endif

                Datenbereich für Empfang eines Satzes vorbereiten
                osqlda#.sqln% = d% * 256
                declare data#[d%-1]
                declare ind&[d%-1]
                dim data#[], maxlen& + 1

                whileloop 0, d% - 1

                    long osql#, sizeof(osqlda#) + &loop * sizeof(osqlvar#) + 8 = addr(data#[&loop])
                    long osql#, sizeof(osqlda#) + &loop * sizeof(osqlvar#) + 12 = addr(ind&[&loop])

                endwhile

                Daten satzweise holen und auswerten
                var retcode& = 0
                retcode& = fb_isc_dsql_fetch(addr(status_vector&[0]), addr(stmt&), 1, osql#)

                while retcode& <> 100   100: keine weiteren Sätze

                    if ((status_vector&[0] = 1) and status_vector&[1])

                        fbError(status_vector&[])

                    endif

                    zeile$ =

                    whileloop 0, d%-1

                        select ftyp%[&loop]

                            caseof &varchar, &varchar2

                            fdata$[&loop] = string$(data#[&loop],2)

                            caseof &date, &date2

                            fb_isc_decode_sql_date(data#[&loop],tm_date#)
                            fdata$[&loop] = dtoc$(format$(%.4d, tm_date#.jahr& + 1900)
                            + format$(%.2u, tm_date#.mon& + 1)
                            + format$(%.2u, tm_date#.tag&))

                            caseof &char, &char2

                            fdata$[&loop] = string$(data#[&loop],0)

                            caseof &long, &long2, &short, &short2

                            fdata$[&loop] = str$(long(data#[&loop],0))

                            caseof &float, &float2

                            fdata$[&loop] = str$(double(long(data#[&loop],0)))

                            caseof &blob, &blob2

                            fdata$[&loop] = BLOB- + str$(fstyp%[&loop])

                        endselect

                        zeile$ = zeile$ + pad(fdata$[&loop],flen%[&loop]) + |

                    endwhile

                    inc sqlcount&
                    Datenzeile ausgeben

                    select mode%

                        caseof 0 : print zeile$

                        caseof 1 : addstring zeile$

                    endselect

                    retcode& = fb_isc_dsql_fetch(addr(status_vector&[0]), addr(stmt&), 1, osql#)

                endwhile

            endif

            Statementhandle freigeben
            fb_isc_dsql_free_statement(addr(status_vector&[0]), addr(stmt&), &DSQL_drop)
            endif  SELECT-Ende
            Transaktion abschließen
            fb_isc_commit_transaction(addr(status_vector&[0]), addr(trans&))

        endif

        if ((status_vector&[0] = 1) and status_vector&[1])

            fbError(status_vector&[])

        endif

        return sqlcount&

    endproc

    =============
    HAUPTPROGRAMM
    =============
    window 1000, 800
    cls
    var db1& = fbInit(SYSDBA, masterkey, Employee.fdb)
    set(errorlevel, -1)
    fbSQLExec(db1&, drop table BUECHER, 1)
    set(errorlevel, 1)
    fbSQLExec(db1&, create table BUECHER (titel CHAR(40), autor CHAR(40), preis NUMERIC(8,2), datum TIMESTAMP), 1)
    fbSQLExec(db1&, INSERT INTO buecher (titel,autor,preis) VALUES (XProfan für Dummies,RGH-Soft,19.94), 1)
    clearlist
    fbSQLExec(db1&, select * from BUECHER, 1)
    listbox$(BUECHER:,2)
    clearlist
    print fbSQLExec(db1&, select EMP_NO, FIRST_NAME, LAST_NAME, JOB_CODE, JOB_GRADE, JOB_COUNTRY, FULL_NAME, PHONE_EXT, HIRE_DATE from EMPLOYEE, 1)
    listbox$(EMPLOYEE:,2)
    clearlist
    print fbSQLExec(db1&, select * from PROJECT, 1)
    listbox$(PROJECT:,2)
    clearlist
    print fbSQLExec(db1&, select * from CUSTOMER, 1)
    listbox$2>(CUSTOMER:,2)
    waitinput
    fbDone(db1&)
    end
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
22.04.2009  
 



 
- Page 2 -



RGH
Ciao,

und es geht weite: Sie ist noch nicht ganz reif, aber schon vorzeigbar: Die Include, bzw. PCU, um direkt auf FireBird Embedded zuzugreifen. Ohne Installation von Treibern oder Einträgen in den ODBC-Manager kann direkt auf Tabellen zugegriffen werden. Es können sogra komplette Datenbanken erzeugt werden. Particolari gibt es hier:

[...] 

Viel Divertimento mit dem Ausprobieren. Eine dettagliato Referenz der PCU-Funktionen folgt in den nächsten Tagen!

Und die BLOBs bringe ich der PCU auch noch bei ...

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
23.04.2009  
 




Dietmar
Horn
Danke Roland,

Danke! Dankeschön! usw.

Saluto
Dietmar

Den anderen Rest sollten wir vielleicht besser circa meine GMX-Adresse vereinbaren.

Saluto
Dietmar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
23.04.2009  
 




RGH
RGH, Beitrag=51964, Zeitpunkt=23.04.2009
Eine dettagliato Referenz der PCU-Funktionen folgt in den nächsten Tagen!


Ok, Referenz und Beispielprogramme nebst Erläuterungen sind jetzt am oben genanntem Ort auch Online!

Tipps und Tricks folgen ...

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
23.04.2009  
 




Dietmar
Horn
Einfach Super! Einfach genial!

Und das noch nicht mal 1 Woche nach meinem verzweifelten Hilferuf per PM!

Sowas an Kundenfreundlichkeit sollen die Großen, wie z.B. Microsoft oder Borland, erst mal nachmachen! Das kriegen die nie und nimmer gebacken!

Wer jetzt noch immer glaubt, XProfan sei keine vollwertige Windows-Programmiersprache, nur weil XProfan international leider noch relativ unbekannt ist, dem ist wirklich nicht mehr zu helfen!

Ich fühle mich jedenfalls ein weiteres Mal darin bestätigt, auf das Pferd namens XProfan als Programmiersprache gesetzt zu haben! Und alle diese Spinner, die es leider auch in unserem Territorium gibt (in erster Linie die Informatiklehrer an den Hoyerswerdaer Gymnasien), die meinen, XProfan sei eine kleine und schrottige Hilfs-Programmiersprache, die lasse ich inzwischen immer weiter links liegen, wie z.B. ein verschimmeltes Dreipfundbrot!

Saluto und Danke!
Dietmar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
23.04.2009  
 




Dietmar
Horn
Zitat aus der aktuellen XProfan.chm:


XProfan ist auch eine komplette Datenbanksprache. Einfache bis mittlere Datenbank-Anwendungen können mit XProfan problemlos realisiert werden.


Sowas sollte meiner Meinung nach schnellstmöglich aus der Hilfedatei gekillt werden!

Mit XProfan auch professionelle DBMS-Anwendungen erstellen zu können - das ist inzwischen absolut kein Problem mehr!

Nachdem inzwischen sogar schon Zehnjährige vorzeigbare und niveauvolle XProfan-Programme nachweisen können, dann sollten sich deren Informatiklehrer mit ihrem TP-/BP-Quatsch per DOS in Grund und Boden schämen!

Saluto
Dietmar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
24.04.2009  
 




RGH
Eben habe ich eine aktuelle Version der PCU mit neuen Beispielprogrammen hochgeladen. (Gleicher Ort, gleicher Dateiname!)

Was ist neu?

64-Bit-Integertypen werden nun voll supportati. Da es in XProfan diesen Datentyp nicht gibt, werden intern in der PCU Floats (doppelte Genauigkeit) verwandt, so dass die Genauigkeit auf 16 Stellen begrenzt ist.

Text-Blobs (BLOB SUB_TYPE 1) werden nun in normalen SQL-Befehlen supportati. Dabei ist zu beachten, dass die Länge des SQL-Befehles bei Firebird die 64k-Grenze nicht überschreiten darf. Andernfalls erfolgt eine Fehlermeldung.

Was die unbegrenzte Nutzung von BLOBs betrifft, suche ich noch nach einer eingängigen Syntax.

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
25.04.2009  
 




Detlef
Jagolski
Tolle Sache, nur Schade dass die PCU nicht mit Profan2CPP geht.

Saluto

Detlef
 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
25.04.2009  
 



Vielleicht aus dem Unitcode mit Prf2CPP eine DLL herstellen. ^^
 
25.04.2009  
 




RGH
Detlef Jagolski, Beitrag=52038, Zeitpunkt=25.04.2009
Tolle Sache, nur Schade dass die PCU nicht mit Profan2CPP geht.


Sobald ich auch die BLOBs drin habe und den Quellcode ein bißchen optimiert, aufgehübscht und kommentiert habe, gibt es auch den Quellcode der PCU, der dann mi $I als Include eingebunden werden kann. Und dann kann auch Profan2CPP damit was anfangen. Bitte noch etwas Geduld. Noch bin ich am Basteln.

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
25.04.2009  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

7.154 Views

Untitledvor 0 min.
Peter Max Müller04.02.2019
H.Brill09.02.2017
Michael Klumb29.03.2016
rquindt01.03.2016
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie