![]() |
Datenbank: ACCESS • Version: 2003 • Zugriff über: ADO
ADOQuery SQL Parameter keine Übergabe
Hallo Peopz,
kann mir einer weiterhelfen. Ich versuche mit einer ADOQuery eine Tabelle zu füllen:
Delphi-Quellcode:
Und bei ADOQuery1.Active sagt mir der Debugger:
procedure TForm2.New_Warenbestand(table1, table2: TADOTable); //Neuer Artikel in Warenbestand (KOMSA)
var i :Integer; begin ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('INSERT INTO Warenbestand(products_id, external_id, permission_id, products_owner, products_ean, products_quantity, products_average_quantity,' +'products_shippingtime, products_model, products_master_model, products_master_flag, products_option_template, products_option_list_template,' +'products_sort, products_image, products_price, date_added, last_modified, date_available, products_weight, products_status, products_tax_class_id,' +'product_template, product_list_template, manufacturers_id, products_ordered, products_transactions, products_fsk18, products_vpe, products_vpe_status,' +'products_vpe_value, products_startpage, products_startpage_sort, products_average_rating, products_rating_count, products_digital,' +'products_serials, categories, products_description_de, products_name_de, products_short_description_de, url_text_de, meta_title_de, meta_keywords_de,' +'meta_description_de, products_description_en, products_name_en, products_short_description_en, url_text_en, meta_title_en, meta_keywords_en, meta_description_en)'); ADOQuery1.SQL.Add('VALUES(:products_id, :external_id, :permission_id, :products_owner, :products_ean, :products_quantity, :products_average_quantity,' +':products_shippingtime, :products_model, :products_master_model, :products_master_flag, :products_option_template, :products_option_list_template,' +':products_sort, :products_image, :products_price, :date_added, :last_modified, :date_available, :products_weight, :products_status, :products_tax_class_id,' +':product_template, :product_list_template, :manufacturers_id, :products_ordered, :products_transactions, :products_fsk18, :products_vpe, :products_vpe_status,' +':products_vpe_value, :products_startpage, :products_startpage_sort, :products_average_rating, :products_rating_count, :products_digital,' +':products_serials, :categories, :products_description_de, :products_name_de, :products_short_description_de, :url_text_de, :meta_title_de, :meta_keywords_de,' +':meta_description_de, :products_description_en, :products_name_en, :products_short_description_en, :url_text_en, :meta_title_en, :meta_keywords_en, :meta_description_en)'); i := TableStepBack(table2); ADOQuery1.Parameters.ParamByName('products_id').Value := i; //hier übergebe ich einen Wert, aber der Debugger mekkat! ADOQuery1.Parameters.ParamByName('external_id').Value := table1.FieldByName('ARTIKELNUMMER').AsString; ADOQuery1.Parameters.ParamByName('permission_id').Value := '0'; ADOQuery1.Parameters.ParamByName('products_owner').Value := '1'; . . . ADOQuery1.ExecSQL; ADOQuery1.Active := true; end; --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt DatenZugriff.exe ist eine Exception der Klasse EOleException mit der Meldung 'Sie müssen einen Wert in das Feld 'Warenbestand.products_id' eingeben' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- Obwohl ich einen Wert an 'products_id' übergeben, nämlich i. Was ist hier faul? |
AW: ADOQuery SQL Parameter keine Übergabe
Und was "mekkat" der Compiler? Außerdem: entweder Active auf true oder Open/ExecSQL, aber nicht beides.
|
AW: ADOQuery SQL Parameter keine Übergabe
Dieses SQL-Statement liefert doch keine Daten zurück.
Es wird ausgeführt (der Name lässt es ja auch schon vermuten) mit
Delphi-Quellcode:
Ein
ExecSQL
Delphi-Quellcode:
ist dabei unsinnig und falsch, weil nun das Statement nochmals ausgeführt wird und ein ResultSet erwartet wird, was es aber nicht gibt.
Active := True
Ist auf der Spalte
Code:
auch noch ein Unique-Index dann rummst es dort auch noch.
products_id
Kontrollier doch mal die DB, denn die Werte sollten dann drinstehen (wenn es erst nach dem ExecSQL knallt) |
AW: ADOQuery SQL Parameter keine Übergabe
Danke für den Tipp, wie gesagt ich bekomme die Meldung:
--------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt DatenZugriff.exe ist eine Exception der Klasse EOleException mit der Meldung 'Sie müssen einen Wert in das Feld 'Warenbestand.products_id' eingeben' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- Der Compiler meckert nicht. |
AW: ADOQuery SQL Parameter keine Übergabe
Es lohnt sich übrigens immer ein Blick in die
![]() |
AW: ADOQuery SQL Parameter keine Übergabe
Hast Du die "Active"-Zeile denn jetzt rausgenommen?
|
AW: ADOQuery SQL Parameter keine Übergabe
Zitat:
|
AW: ADOQuery SQL Parameter keine Übergabe
Handelt es sich um einen Autowert? Den müsstest Du gar nicht übergeben.
|
AW: ADOQuery SQL Parameter keine Übergabe
Also, leider wird der Wert nicht automatisch übergeben. Es ist in Access definiert 'Eindeutig', vorher war auch noch 'Ist erforderlich', das hab ich mal weggenommen und nun kommt folgende Meldung:
'Nullwert in Index oder Primär-Schlüssel nicht möglich' Wie kann ich den eine automatische Wert setzen, habt das ganze mit eine Variable gelöst (i), die wird so ermittelt:
Delphi-Quellcode:
function TableStepBack(table :TADOTable) :Integer; //ID-nummer Ermitteln
var s :Integer; begin table.Last; Result := table.FieldByName('products_id').AsInteger + 1; end; |
AW: ADOQuery SQL Parameter keine Übergabe
Damit das überhaupt funktionieren kann, muss die Tabelle auf jeden Fall aktuell und nach der ID sortiert sein.
|
AW: ADOQuery SQL Parameter keine Übergabe
Also, ich habe das mit dem 'products_id' hab ich gelöst. Hab in Access die Spalte als AutoWert definiert. Nun arbeitet das Query, aber ausser der products_id wird nichts in die Tabelle geschrieben.
|
AW: ADOQuery SQL Parameter keine Übergabe
Ich nehme mal an, du hast auch das SQL-Statement angepasst und die products_ID rausgenommen?
Generell mal gefragt, wieso arbeitest du/man mit den Parametern? Mach man das so? Hätte man nicht einfach die Werte direkt beim Zusammenbaues des SQL-Statements da reinschreiben können? |
AW: ADOQuery SQL Parameter keine Übergabe
ja, die products_id ist aus dem sql raus:
Delphi-Quellcode:
Keine ahnung, hab das so gelernt. Ich muss werte aus einer anderen Tabelle kopieren, die nicht identisch ist mit der Tabelle 'Warenbestand'.
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Warenbestand(external_id, permission_id, products_owner, products_ean, products_quantity, products_average_quantity,' +'products_shippingtime, products_model, products_master_model, products_master_flag, products_option_template, products_option_list_template,' +'products_sort, products_image, products_price, date_added, last_modified, date_available, products_weight, products_status, products_tax_class_id,' +'product_template, product_list_template, manufacturers_id, products_ordered, products_transactions, products_fsk18, products_vpe, products_vpe_status,' +'products_vpe_value, products_startpage, products_startpage_sort, products_average_rating, products_rating_count, products_digital,' +'products_serials, categories, products_description_de, products_name_de, products_short_description_de, url_text_de, meta_title_de, meta_keywords_de,' +'meta_description_de, products_description_en, products_name_en, products_short_description_en, url_text_en, meta_title_en, meta_keywords_en, meta_description_en)'); ADOQuery1.SQL.Add('VALUES(:external_id, :permission_id, :products_owner, :products_ean, :products_quantity, :products_average_quantity,' +':products_shippingtime, :products_model, :products_master_model, :products_master_flag, :products_option_template, :products_option_list_template,' +':products_sort, :products_image, :products_price, :date_added, :last_modified, :date_available, :products_weight, :products_status, :products_tax_class_id,' +':product_template, :product_list_template, :manufacturers_id, :products_ordered, :products_transactions, :products_fsk18, :products_vpe, :products_vpe_status,' +':products_vpe_value, :products_startpage, :products_startpage_sort, :products_average_rating, :products_rating_count, :products_digital,' +':products_serials, :categories, :products_description_de, :products_name_de, :products_short_description_de, :url_text_de, :meta_title_de, :meta_keywords_de,' +':meta_description_de, :products_description_en, :products_name_en, :products_short_description_en, :url_text_en, :meta_title_en, :meta_keywords_en, :meta_description_en)'); |
AW: ADOQuery SQL Parameter keine Übergabe
Hat keiner mehr eine Idee, warum die VALUES in die Tabelle nicht übergeben werden?
... ich probiere das ganze nun mit ADOTable zu lösen. |
AW: ADOQuery SQL Parameter keine Übergabe
Zum Kopieren von Daten könnte man sich auch einmal die INSERT INTO ... SELECT FROM-Syntax anschauen, das dürfte ggf. einfacher werden als dieses Monsterkonstrukt.
|
AW: ADOQuery SQL Parameter keine Übergabe
Zitat:
Stichwort: SQL-Injection und Performance (um nur 2 zu nennen) Ich vermute jetzt mal, dass die Verbindung der Parameter-Liste nicht so richtig passt. Erzeuge auf der Form ein TADOQuery mit dem SQL-Statement und prüfe über den OI die Parameter. Dann benutzt du genau diese Query in deiner Procedure, füllst die Parameter und lass die dann mal ausführen. Und DeddyH hat auch recht, wenn alle Daten schon in der DB vorhanden sind, macht es keinen Sinn diese erst zum CLient zu holen und dann wieder zurück zur DB zu schicken. Das geht dann auch direkt in der DB |
AW: ADOQuery SQL Parameter keine Übergabe
schau ich mir mal an, ich probiers jetzt erstmal step_by_step... erstmal nur eine spalte in der Tabelle auffüllen und wenn das klappt, sehen wir weiter ;)
@Jumpy: danke für den tipp, probiere ich gleich danach aus! |
AW: ADOQuery SQL Parameter keine Übergabe
Probier das lieber nicht aus, siehe Sir Rufos Post.
|
AW: ADOQuery SQL Parameter keine Übergabe
sorry ich meinte auch sirRufos ))
|
AW: ADOQuery SQL Parameter keine Übergabe
Also das funktioniert schon mal:
Delphi-Quellcode:
ABER VOLL LANGSAM! Ich habe 8000 Datensätze ))
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Warenbestand(external_id)'); ADOQuery1.SQL.Add('SELECT ARTIKELNUMMER FROM Tabelle2'); ADOQuery1.ExecSQL; |
AW: ADOQuery SQL Parameter keine Übergabe
Wie oft führst Du das denn aus? Auf diese Weise müsstest Du 8000 neue DS erzeugt haben.
|
AW: ADOQuery SQL Parameter keine Übergabe
Nein, ich habe mich geirrt. Ist alles super schnell. Es war das DBGrid bzw. hatte ich noch ein Tabelle2.Next irgendwo eingebaut...
Noch eine Frage, mittlerweile sind meine AutoWerte (products_id) in der Tabelle schon bei 16000, kommt durch das ständige herrumprobieren. Wie kann ich den AutoWert wieder bei 0 oder 1 Starten? |
AW: ADOQuery SQL Parameter keine Übergabe
Tut mir leid, bei Access muss ich leider passen.
|
AW: ADOQuery SQL Parameter keine Übergabe
Lasse die Datenbank reorganisieren, dann werden die AutoWerte auch wieder angepasst
|
AW: ADOQuery SQL Parameter keine Übergabe
Zitat:
Zitat:
|
AW: ADOQuery SQL Parameter keine Übergabe
Ich habe noch eine Frage, wie kann ich eigentlich in einem ADOQuery in einer Tabelle editieren.
|
AW: ADOQuery SQL Parameter keine Übergabe
Meinst Du die Definition oder die Daten?
|
AW: ADOQuery SQL Parameter keine Übergabe
Ich meine die Daten, also ersetze wert x an stelle y mit wert z ))
|
AW: ADOQuery SQL Parameter keine Übergabe
SQL-Code:
Update <Tabelle> set <y> = <Z>;
|
AW: ADOQuery SQL Parameter keine Übergabe
Und laut Hilfe sollte man dafür wohl ein TADOCommand statt einer Query benutzen.
|
AW: ADOQuery SQL Parameter keine Übergabe
Zitat:
|
AW: ADOQuery SQL Parameter keine Übergabe
Ich mache nix mit ADO, aber
Zitat:
|
AW: ADOQuery SQL Parameter keine Übergabe
Zitat:
Delphi-Quellcode:
verwechselt (Augen auf beim Eierkauf :mrgreen: )
TADOConnection.Execute
|
AW: ADOQuery SQL Parameter keine Übergabe
Das mit dem Update funktioniert ganz gut. Nun noch ein kleines Problem, in der Tabelle einen Tabelle sind Einkaufspreise gegeben. Ich muss nun in die neue Tabelle die berechnten Verkaufspreise übergeben.
Bis jetzt habe ich das hier:
Delphi-Quellcode:
Das Problem liegt auf der Hand, für jede Zeile in der Tabelle Warenbestand wird immer der selbe Preis-Wert ermittelt. Komm ich mit eine while not table1.Eof... table1.next weiter?
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Update Warenbestand set products_price = :price'); ADOQuery1.Parameters.ParamByName('price').Value := FloatToStr(PreisKalkulieren(table1.FieldByName('EK_EUR').AsFloat)); ADOQuery1.ExecSQL; |
AW: ADOQuery SQL Parameter keine Übergabe
Dann musst Du die alten Datensätze wohl durchgehen. Das bedeutet, dass das ADOCommand noch eine WHERE-Klausel benötigt, um den neuen Datensatz eindeutig zu identifizieren.
[edit] Es sei denn, der neue Preis wird immer gleich berechnet, dann kannst Du das auch per SQL in einem Rutsch machen. [/edit] |
AW: ADOQuery SQL Parameter keine Übergabe
Ich denke nicht, dass es so richtig ist. Hab mir das mal mit Where angeschaut und das query scheint nicht den nächsten Wert aus der Ausgangs-Tabelle zu ziehen.
Mit AdoTable sah das so aus:
Delphi-Quellcode:
Wo springt das Query mit Where auf die nächste Zeile in table1 ?
while not table1.eof do
begin table2.fieldbyname('products_price').AsFloat := CalcVerkaufsPreis(table1.fieldbyname('einkauf_price').AsFloat); table2.post; table1.next; table2.next; end; |
AW: ADOQuery SQL Parameter keine Übergabe
Wenn ich das richtig verstanden habe, willst Du die Daten aus der neuen Tabelle updaten und dabei Werte aus der anderen, alten Tabelle nutzen?
Das Stichwort ist "correlated subquery" also korrelierte Unterabfrage. Hier gibts ein schönes Beispiel, fast schon die passenden Felder, auf Deutsch und in Farbe :) ![]() Unter "Beispiel" Punkt 6 dürfte das stehen, was Du brauchst. EDIT: Hab Dein letztes Post übersehen, aber ich denke, Du kannst es mit einem einzigen update machen. EDIT2: Dein Beispiel sieht sehr eigenartig aus. Tabelle 1 und Tabelle 2 werden überhaupt nicht nach irgendeinem Schlüssel "synchronisiert", das wär höchstens Glückssache, wenn das klappt |
AW: ADOQuery SQL Parameter keine Übergabe
jobo, danke für denk link... sieht vielversprechend aus! wenns klappt melde ich mich ))
|
AW: ADOQuery SQL Parameter keine Übergabe
wenn's nicht klappt vermutlich erst recht ;)
|
AW: ADOQuery SQL Parameter keine Übergabe
haha )) ... so hat geklappt, danke!
hier mal ein beispiel aus meinem code:
Delphi-Quellcode:
Das mit dem Preis ist noch komplizierter, weil ich dort unterschiedliche prozent-kategorien haben...
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE Warenbestand As W INNER JOIN KOMSA As K On W.external_id = K.KOMSANUMMER SET W.products_weight = K.GEWICHT/1000'); ADOQuery1.ExecSQL; gibts eigentlich so was wie ein if then in sql? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz