Variable im BeforePost übergebn??

Alles, was den Programmierer beschäftigt

Moderator: SYNERPY

Antworten
Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Variable im BeforePost übergebn??

Beitrag von Vegeta »

Hallo @ all,
zunächst einmal, ich bin mir nicht sicher ob der Post hier richtig ist, könnte durchaus auch in den SQL-Berich gehören... :?

Also ich habe folgendes Problem:
Neue Tabelle angelegt, und möchte jetzt in einer anderen Tabelle per BeforePost antriggern, dass in der neuen Tabelle ein Datensatz angelegt wird. Funktioniert auch soweit alles. Nur irgendwie bekomme ich es nicht hin, dass die Variable für den Eintrag richtig übergeben wird.
Der Code sieht folgendermaßen aus:

sMK := E_LFKNR.Field.Value;
MySQL := frmdata.universal;
MySQL.Close();
MySQL.SQL.Text := 'insert into BLFK (ID, "Maskenkey") Values (NULL, :sMK)';
MySQL.Open();
MySQL.Close();

Wenn das ganze jetzt ausgeführt wird, legt er mir einen DS in der Tabelle BLFK an, füllt alle Felder brav aus, nur der Maskenkey(in den der Wert der Variable sMK eingetragen werden soll) bleibt leer.
Also an der Variablenfüllung kanns eigentlich nicht liegen. Wenn ich mir den Wert in einer MSGBOX ausgeben lasse stimmt der Wert immer. An der Insert-Anweisung kann es eigentlich auch nicht hängen.
Wenn ich die Variable durch einen Wert ersteze z.B. so:

MySQL.SQL.Text := 'insert into BLFK (ID, "Maskenkey") Values (NULL, 182)';

dann wird alles korrekt ausgeführt und es steht 182 im Maskenkey mit drin.
Ich hab das ganze schon mit String zusammenbauen, konvertieren in die verschiedensten Typen und was weiß ich nicht alles versucht. Aber ich kriegs einfach nicht hin. :cry:

Hat jemand irgendeine Idee??
Bin für jede Hilfe dankbar :D

Gruß
Vegeta
gast_miboe

Beitrag von gast_miboe »

Da fallen mir mal spontan zwei Sachen ein:

* das Feld ist falsch definiert und nimmt keine Strings an, sondern nur Zahlen
* der Doppelpunkt bringt das ganze aus dem Tritt

Deswegen würde ich als erstes mal versuchen, bei der Parameterübergabe den Doppelpunkt wegzulassen und schauen was passiert.

Wenn's geht = Doppelpunkt Problemursache
wenn nicht = dann wohl der String

Bescheid
Michael
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Ganz so einfach geht das nicht :)

Hier hat man prinzipiell zwei Möglichkeiten.

1. Man baut sich den Insert-Befehl als String zusammen:

Code: Alles auswählen

MySQL.SQL.Text := 'insert into BLFK (ID, Maskenkey) Values (NULL, + ' sMK + ')';
Hier wird der Wert aus dem String sMK aneinandergekettet.

2. Man übergibt den Wert als Parameter an das SQL (eleganter, vor allem, wenn man Integer- oder Float-Werte übergeben will):

Code: Alles auswählen

MySQL.SQL.Text := 'insert into BLFK (ID, Maskenkey) Values (NULL, :sMK)'; 
MySQL.ParamByName('sMK',sMK);
//erstes sMK ist der Name des Parameters im INSERT-Befehl, zweiter Wert ist der Name der Variable, die zugewiesen werden soll (hier nicht ganz so deutlich, da ja beide sMK heißen)
Und nochmals: Das Wort Maskenkey darf nicht in Anführungsstrichen stehen! AvERP verwendet den SQL Dialekt 3, bei dem Felder einfach geschrieben werden. Generell: Wer Shift+2 drückt kann sich ziemlich sicher sein, dass er bei AvERP gerade einen Fehler macht ;)
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Interessehalber:
gast_miboe hat geschrieben:
* das Feld ist falsch definiert und nimmt keine Strings an, sondern nur Zahlen
Das wandelt IB/FB automatisch um. Wenn das nicht möglich ist, wird eine Fehlermeldung ausgegeben
gast_miboe hat geschrieben: * der Doppelpunkt bringt das ganze aus dem Tritt
Ohne Doppelpunkt wäre es kein Parameter, sondern ein Wert, nämlich die Zeichenfolge "sMK", allerdings ohne einfache Anführungsstriche. Wiederum würde IB/FB einen Fehler ausgeben.
Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Beitrag von Vegeta »

Hallo Admin,
also erstmal vielen Dank für die schnelle Hilfe :D
Mit dem Zusatz MySQL.ParamByName('sMK',sMK); funktioniert das ganze einwandfrei :lol:

Was die "" angeht:
Und nochmals: Das Wort Maskenkey darf nicht in Anführungsstrichen stehen! AvERP verwendet den SQL Dialekt 3, bei dem Felder einfach geschrieben werden. Generell: Wer Shift+2 drückt kann sich ziemlich sicher sein, dass er bei AvERP gerade einen Fehler macht
Also ich definiere die Felder in der DB ganz normal, ohne "". Wenn ich dann das Feld ID ansprechen will, geht das auch ohne "". Aber bei allen anderen Feldern muss ich beim Aufruf, in AvERP genauso wie in der DB, den Namen in "" setzen, sonst bekomme ich immer den Fehler Colum unknown. Keine Ahnung warum, vielleicht weil ich den EMS InterBase & FireBird Manager 3 benutze...
Also muss der Satz bei mir ungefähr so lauten:
"Wer Shift+2 hier nicht drückt, macht sich nur verrückt. Er kann sich ziemlich sicher sein, er macht grad einen Fehler rein" :wink:

Gruß
Vegeta
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Bitte Programm auf Dialect 3 einstellen. Characterset ISO 8859_1.
Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Beitrag von Vegeta »

Hallo Admin,
ja, sollte ich wohl mal umstellen :)

Hätte da aber noch eine ähnliche Frage:

Habe mal versucht folgende SQL-Abfrage auf die selbe Weise zu erstellen:

Code: Alles auswählen

MySQL := frmdata.universal;
MySQL.Close();
MySQL.SQL.Text := 'select count(*) from BLFK WHERE "Maskenkey" = :iMV';
MySQL.ParamByName('iMV',iMV);
MySQL.Open();
MySQL.Close();
Das ganze sollte ja die Anzahl der Datensätze mit Bestimmtem Maskenkey zurück geben. Läuft auch zumindest mal ohne Fehler durch. Gibt es jetzt hier eine Möglichkeit auf die Rückgabe der SQL-Anweisung zu zugreifen??
Wenn ja, wie sieht die aus??

Gruß
Vegeta
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Das Kind braucht einen Namen, und hier muss man, ironischer Weise, Anführungszeichen setzen:

Code: Alles auswählen


MySQL.SQL.Text := 'select count(*) AS "ZAEHLER" from BLFK WHERE "Maskenkey" = :iMV'; 
MySQL.ParamByName('iMV',iMV); 
MySQL.Open();
iZaehler := 0;
iZaehler := AsInteger(MySQL.FieldByName('Zaehler'));
MySQL.Close();

Vegeta
Beiträge: 106
Registriert: Di Nov 02, 2004 1:35 pm

Beitrag von Vegeta »

Hallo Admin,
danke für die schnelle Hilfe :D
Funktioniert jetzt alles bestens 8)

Und mit den "" ist ja witzig :lol:

Gruß
Vegeta
Antworten