suchen und anhängen

Alles zum SQL-Dialekt

Moderator: Moderatoren

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

suchen und anhängen

Beitrag von Manfred »

ich muß eine Tabelle durchlaufen und dann prüfen, ob es den Datensatz schon in einer anderen Tabelle gibt. Wenn es den Satz nicht gibt, dann soll ein neuer dort angehängt werden.
Die Sourcetabelle wird mit DBSKIP() durchlaufen, die Zieltabelle soll mit SQL durchsucht und im Zweifelsfalle mit SQL ergänzt werden.
Wie löst man Suchen und anhängen elegant mit SQL?

Code: Alles auswählen

SELECT * from tabelle where feld=dings
wenn das Ergebnis leer ist
INSERT INTO tabelle (feld1) VALUES("bla")
oder geht das eleganter?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: suchen und anhängen

Beitrag von georg »

Hallo, Manfred -


für jeden Satz aus Tabelle A, der keine Entsprechung in Tabelle B hat, muss ein Satz angelegt werden - so habe ich das verstanden.

Also,

Code: Alles auswählen

SELECT feld1, feld2, feld3 FROM TabA WHERE feld1 NOT IN (SELECT feld1 FROM TabB)
Ich habe jetzt mal unterstellt, dass über Feld1 verknüpft werden kann. Du erhältst eine Auswahl von Sätzen der Tabelle A, die keine Entsprechung in Tabelle B haben. Jetzt einmal durchackern und die neuen Sätze einfügen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

Hi Georg,
ich durchlaufe Tabelle A mit Xbase und will Tabelle b mit SQL verarbeiten. Dein Vorschlag sieht mir nach reinem SQL aus für beide Tabellen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von UliTs »

Manfred hat geschrieben: Fr, 30. Okt 2020 7:07...Dein Vorschlag sieht mir nach reinem SQL aus für beide Tabellen.
Was spricht dagegen?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

tja Uli, jetzt überlege mal. Wenn eine Tabelle nicht mit SQL angesprochen werden kann, dann ist SQL die schlechte Wahl, oder wie siehst Du das? Deshalb habe ich es ja explizit 2x hervorgehoben, das es NICHT mit SQl komplett gemacht wird.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von Marcus Herz »

Es gibt den MERGE Befehl
Mit Xbase durch tabelle A skippen, mit SQL in Tabelle B schrieben:

Code: Alles auswählen

merge tabelleb
on keyfield = :KEY [ and keyfield2 = :KEY2...]
when not matched then insert (fliedlist) values(-valuelist);
Du kannst den String ja einmalig mit strtran oder änhliches aufbauen, musst nur jedesmal die :KEY Werte neu setzen, Erspart die Extra-Suche, ob es den Satz schon gibt.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

HI marcus,
Danke für den Hinweis. Allerdings kommt doch noch eine weitere Aufgabe hinzu. Die Ursprungstabelle wird sequentiell geführt, also immer hinten dran. Ich durchlaufe die also immer vom Ende her zum Anfang durch. Wenn ich auf einen Satz stoße, der schon vorhanden ist, dann ist die Arbeit beendet und es muß abgebrochen werden. Wie finde ich heraus, wann das der Fall ist? geht das dann auch noch so?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von Marcus Herz »

Du kannst diese Zeile nach dem Merge noch ausführen. Gibt 1 zurück, wenn Satz angehängt wurde, 0 wenn nichts geschah. Das Ergebnis des letzten Statement wird zurückgebeben

Code: Alles auswählen

select ::stmt.UpdateCount from system.iota;
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

hm,
irgendwas mache ich falsch. Ist das der endgültige Befehl, oder muß da noch was spezifisches rein? Ich bekomme immer eine leere Zeile zurück im ARC, oder muß man den Satz mit SQl einfügen? Ich habe es jetzt über normales Xbase eingefügt. Also generell nur einen Test gemacht um mal zu sehen, wie das klappen könnte mit der Abfrage.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von nightcrawler »

Überlass dies dem ADS:

Code: Alles auswählen

merge tabelle2 t2 using tabelle1 t1
on (t2.id=t1.id)
When not matched then insert values(t1.id, t1.text)
damit wird immer alles von Tabelle1 nach Tabelle2 übertragen, was noch nicht drinsteht
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

OK,
um weitere Missverständnisse auszuräumen, hier nochmal der Ablauf
Es gibt ein Programm, in dem Daten gesammelt und in eine DBF gespeichert werden. (KEIN ADS. Format ist noch DBFNTX)
Diese DBF wird jede Stunde 1zu1 umkopiert in ein Verzeichnis, auf das ich mit meinem Programm zugreifen kann (in dem ADS läuft)
Dann wird diese DBF Tabelle geöffnet von meinem Programm und von hinten nach vorne Schritt für Schritt durchlaufen

Code: Alles auswählen

Do While ! ursprung->(BOF())
     Abfrage über SQL in Zieldatei und evtl. Anhängen, wenn nicht vorhanden. Wenn vorhanden dann Ende
     dbskip(-1)
enddo
Ich hoffe das es jetzt deutlich genug ist, das auf der Ursprungsseite kein ADS vorhanden ist und somit der ADS nicht beides verwalten kann. Oder verstehe ich jetzt wen hier falsch?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

Der merge Vorschlag von Marcus sieht ja schon recht gut aus, aber wie ich geantwortet habe, klappt bei mir die Abfrage nicht, ob ein Satz angehängt wurde. Wobei ich dabei nicht verstehe, ob es eine pauschale Prüfung ist, ob generell irgendwo im DD ein Satz angehängt wurde (was dann unbrauchbar wäre) oder ob noch ein zauberwort dazwischen muß um es für die spezielle Tabelle abzufragen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von nightcrawler »

Manfred,
hänge die Quell-Datei mit in deine Datenbank, lass Sie von mir aus auch im compatible mode laufen, damit von außerhalb reingeschrieben werden kann - und dann nimm mein MERGE-Statement. Der ADS sucht Dir alle nicht matchenden Datensätze aus und überträgt sie in die neue Tabelle.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

OK,
das liest sich jetzt anders. Aber wie mache ich das? Die wird doch jedesmal neu kopiert und befindet sich vor allen Dingen überhaupt nicht in Reichweite des ADS. Es ist ein koplett anderer Server. Zwar im gleichen Netzwerk, aber eben ein anderer Server. Geht das denn so ohne weiteres, oder muß jedesmal irgendwas beachtet werden? Läuft das dann über die gleiche Connection, wie die anderen DBFS, die eingebunden sind?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

nun,
da es wohl doch nicht so einfach ist, hier noch eine Info dazu.
Die besagte DBF wird stündlich umkopiert. Damit es keine Überschneidungen gibt, benenne ich sie vor der Übernahmeprüfung um, damit ich in Ruhe damit arbeiten kann und sollte zwischendurch eine neue kommen, dann wird der Kopierversuch wenigstens nicht behindert, wenn ich gerade mit meinem Programm die DBF auslese. Danach wird die umbenannte DBF gelöscht. Deshalb sehe ich da auch schon Probleme darin, es in den ADS zu integrieren.
Wenn ich das alles vorher gewußt hätte, in welche Richtung das hier geht, hätte ich das natürlich alles direkt zu Anfang erwähnt, aber wer ahnt schon sowas....?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von nightcrawler »

dann zuvor ein

Code: Alles auswählen

EXECUTE PROCEDURE sp_AddTableToDatabase(...)
ausführen und die DBF/NTX in die Datenbank integrieren. Danach mit

Code: Alles auswählen

DROP TABLE xyz;
wieder löschen (wird auch phys. gelöscht).
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

Oh³
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von nightcrawler »

oh was?
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

Oh, ich bin begeistert und
oh ich bin überrascht und
oh ich versuche es sofort.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

leider klappt das hier nicht

Code: Alles auswählen

EXECUTE PROCEDURE sp_addTableToDatabase('tbuch1_kopie','z:\tauschverzeichnis\fuhrparkverwaltung\webdienst\',1,2)
ERROR IN SCRIPT: poQuery: Error 7200: AQE Error: State = S0000; NativeError = 2129; [SAP][Advantage SQL Engine]Unequal number of insert columns and insert values or the incorrect number of stored procedure input parameters
ich lese jezt nochmal in der Hilfe nach, aber im Moment kann ich damit nichts anfangen, was gemeldet wird
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von nightcrawler »

klar, da fehlen auch noch Parameter. SQL will alle gefüllt, auslassen gilt nicht!

EXECUTE PROCEDURE sp_AddTableToDatabase(
‘Customer Information’,
‘\\server\share\mydata\customer.dbf’,
1,
2,
‘Lastname.ntx;Cust_id.ntx’,
NULL );
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von UliTs »

Manfred hat geschrieben: Fr, 30. Okt 2020 7:59 tja Uli, jetzt überlege mal. Wenn eine Tabelle nicht mit SQL angesprochen werden kann, dann ist SQL die schlechte Wahl, oder wie siehst Du das? Deshalb habe ich es ja explizit 2x hervorgehoben, das es NICHT mit SQl komplett gemacht wird.
Sorry, was ist los?
In welchem Faden hast du das denn hervorgehoben? Hier finde ich nichts...
Warum kann denn Deiner Meinung nach die Tabelle nicht mit SQL angesprochen werden?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

sind denn gemappte Laufwerke nicht erlaubt?
Und in der Anleitung steht ausdrücklich
TableName,TablePath
wieso muß dann jetzt bei tablePath noch der DBF Name mit angegeben werden?

Code: Alles auswählen

EXECUTE PROCEDURE sp_addTableToDatabase('tbuch1_kopie','z:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie',1,2,NULL,NULL)
Eine Indexdatei gibt es nicht, also habe ich das mit Null ausgefült.
das kommt dabei heraus
poQuery: Error 7200: AQE Error: State = HY000; NativeError = 7041; [SAP][Advantage SQL Engine][ASA] Error 7041: File not found. Verify the specified path and file name is correct. z:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf
Und damit keiner auf die idee kommt zu sagen Datei gibt es nicht....
tbuch.PNG
tbuch.PNG (33.37 KiB) 8534 mal betrachtet
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: suchen und anhängen

Beitrag von Marcus Herz »

Ein ADS Server läuft als Dienst und kennt keine gemappten Laufwerke, immer UNC verwenden!
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: suchen und anhängen

Beitrag von Manfred »

ok, habe ich dann so gemacht jetzt

Code: Alles auswählen

EXECUTE PROCEDURE sp_addTableToDatabase('tbuch1_kopie','\\SAMBA42X\projekte\verkehrsbetriebe\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie',1,2,NULL,NULL)
poQuery: Error 7200: AQE Error: State = HY000; NativeError = 7013; [SAP][Advantage SQL Engine][ASA] Error 7013: Advantage server file access error. \\SAMBA42X\projekte\verkehrsbetriebe\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf
tbuch.PNG
tbuch.PNG (42.65 KiB) 8527 mal betrachtet
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten