Seite 3 von 4
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 11:54
von Manfred
ich kann Dir mal wieder nicht folgen. Was muß ich da tun?
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 11:57
von Marcus Herz
Du musst zudem temporäre Dateien nicht dem Dic hinzufügen:
Code: Alles auswählen
select * from "\\myserver\myshare\mydir\temp.cdx" temp
so kannst du freie Tabellen verwenden, auch für JOINs etc.
Di können dann auch in einem anderen Verzeichnis stehen, nur der gleiche Server muss es sein
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 12:02
von Marcus Herz
Da haben sich unsere Antworten überschnitten...
Code: Alles auswählen
TEXT INTO cSQLSTmt WRAP Chr(13) TRIMMED
MERGE tankbuch tb USING (select * from "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk ) tbk
ON (tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
WHEN NOT MATCHED THEN INSERT (art, kfznr, kmstand, menge, persnr, tankdatum, tankzeit, terminalnr) VALUES(tbk.art, tbk.kfznr, tbk.kmstand,tbk.menge, tbk.persnr,tbk.tankdatum, tbk.tankzeit, tbk.terminalnr)
ENDTEXT
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 12:44
von Manfred
ah, es kann mit Laufwerksbuchstaben gearbeitet werden.
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 13:00
von Manfred
löst aber mein Problem nicht. Die Datei bleibt offen und kann am Ende nicht gelöscht werden. Oder sagen wir mal anders, sie bleibt für den Löschzugriff gesperrt. Wenn ich Workspacelist() aufrufe steht sie nicht drin, aber im ARC wird sie ale geöffnet angezeigt.
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 13:00
von Marcus Herz
- Besser ist UNC, hab nur den Pfad kopiert
- Laufwerksbuchstabe muss für den Server gültig sein
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 13:05
von Marcus Herz
JA, der ADS cached die letzten 20 Tabellen. Aus Performance Gründen, Ist auch so richtig.
Es gibt die
Funktion, wie die du mit deiner Umgebung aufrufen kannst weiß ich nicht.
Der Hendle kann von DacSession ausgelesen werden, find aber auf die Schenlle nicht wo
Re: suchen und anhängen
Verfasst: Mo, 11. Jan 2021 19:13
von ramses
Den Handle bekommst du mit dieser Funktion
Code: Alles auswählen
static FUNCTION AdsExtGetConnectHandle( cServerPath )
LOCAL nConnectHandle := 0
LOCAL rc
DEFAULT cServerPath TO SET(_SET_DEFAULT)
rc := DllCall( "ACE32.DLL", DLL_STDCALL, "AdsFindConnection", @cServerPath, @nConnectHandle )
AdsExtErrorCheck( rc )
return nConnectHandle
Re: suchen und anhängen
Verfasst: Do, 14. Jan 2021 8:33
von Manfred
Sorry,
aber es fällt mir schwer zu glauben, das es als Cache offen gehalten wird. Die DBF, aus der übernommen wird, bleibt so lange auf, bis das Programm einmal geschlossen wird ( mehr als 8 Stunden). Dann wird sie auch sofort geschlossen. Bzw. dann ist sie aus der Liste "open Files" im Architekten verschwunden.
Re: suchen und anhängen
Verfasst: Do, 14. Jan 2021 10:30
von Marcus Herz
Ich habe gestern beim Stöbern in PDR einen Eintrag gefunden, vielleicht trifft der ja für dich zu:
https://www.alaska-software.com/scripts ... PDRID=7290
Re: suchen und anhängen
Verfasst: Do, 14. Jan 2021 10:43
von Marcus Herz
dann ist sie aus der Liste "open Files" im Architekten verschwunden
das ist dann auch definitiv kein AdsCacheProblem, weil die siehst du von außen nicht als geöffnet.
Re: suchen und anhängen
Verfasst: So, 25. Jul 2021 12:45
von Manfred
Also, das hier klappt ja.
Code: Alles auswählen
MERGE tankbuch tb USING (SELECT * FROM "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk ) tbk
ON (tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
WHEN NOT MATCHED THEN INSERT (art, kfznr, kmstand, menge, persnr, tankdatum, tankzeit, terminalnr) VALUES(tbk.art, tbk.kfznr, tbk.kmstand,tbk.menge, tbk.persnr,tbk.tankdatum, tbk.tankzeit, tbk.terminalnr)
Jetzt würde ich aber gerne noch im gleichen Zug über "kfznr" in einer anderen Tabelle einen Satz suchen und dem dann den kmstand übergeben. Aber nur, wenn der neue höher ist als der, der dort eingetragen ist. Natürlich nur, wenn der Satz auch im Tankbuch angehängt wird.
Geht das in einem Rutsch, oder wie müßte man sowas lösen? Hat wer einen Vorschlag?
Es würde auch genügen, wenn die Sätze, die neu angehängt wurden in eine temporäre Tabelle geschrieben würden und ich dann am Ende diese durchlaufe und damit Suche und update.
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:32
von Marcus Herz
in einer anderen Tabelle einen Satz suchen und dem dann den kmstand übergeben
Das geht nicht im gleichen SQL, merge (update oder insert) kann nur in eine Datei schreiben.
Du könntest vor dem Merge (ich nehme an du hats keine LOG Felder, an denen du die neuen hinterher erkannen kannst)
den KM Stand schreiben:
Code: Alles auswählen
UPDATE <tabkmstand>
SET kmstand = tbk.kmstand
from <tabkmstand>
left join "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk ) tbk on tbk.kfznr = <tabkmstand>.kfznr
WHERE kmstand < tbk.kmstand
and not eixsts (
SELECT *
FROM tankbuch tb
WHERE tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
Ist ein wenig (zu) verschachtelt. Eine Tmp Tabelle erstellst du so:
Code: Alles auswählen
TRY drop table #tmp; CATCH ALL END TRY;
// neue Sätze ermitteln, das was ja im Merge auch passiert
SELECT * into #tmp
FROM "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk
and not eixts (
SELECT *
FROM tankbuch tb
WHERE tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
;
// die neuen Sätze schreiben
INSERT INTO tankbuch
(art, kfznr, kmstand, menge, persnr, tankdatum, tankzeit, terminalnr)
SELECT tbk.art, tbk.kfznr, tbk.kmstand,tbk.menge, tbk.persnr,tbk.tankdatum, tbk.tankzeit, tbk.terminalnr
FROM #tmp tbk
:
// kmstand aus den neuen Sätzen abfragen
UPDATE <tabkmstand>
SET kmstand = tbk.kmstand
from <tabkmstand>
left join #tmp tbk on tbk.kfznr = <tabkmstand>.kfznr
WHERE kmstand < tbk.kmstand
;
drop table #tmp;
Wie immer, mangels Tabellen, ungetestet
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:36
von Manfred
auh backe, das hatte ich befürchtet.
Ich glaube ich muß dann doch anders herangehen. Das soll ja auch nocht später von mir durchschaubar sein und bleiben.
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:39
von Manfred
aber andersherum gefragt, die Ursprungsdaten sind ja sequentiell angeordnet. Wenn ich jetzt bei dem MERGEN ermitteln könnte, ab welchem Satz gemerged wird, dann wäre das evtl. auch eine Möglichkeit dann später ab dem entsprechenden Satz die restlichen paar nochmal zu durchlaufen und dann die KM Stände zu übertragen. Es kommen ja nicht so viele täglich dazu. Es ist blos die gesamte Samllung, die die Tabelle so groß werden läßt-
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:41
von Marcus Herz
Ich hab in den Code mit Temp Tabelle noch Kommentare eingefügt. Hat den Vorteil, dass so immer auch bei Paralell Verarbetung das stimmt. Sich die letzte RowID zu merken, funktioniert auch, aber nur wenn nur von einer Anbwendung geschrieben wird
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:43
von Marcus Herz
die Ursprungsdaten sind ja sequentiell angeordnet.
Das gilt nciht mehr, ist zwar meistens so, aber keine Definition
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:46
von Manfred
halt, evtl. falsch verstanden.
Ich habe ja eine DBF in die immer nur angehängt wird. Diese wird durchlaufen und dann eben die neuen Sätze gemerged. Es wäre halt gut, wenn man wüßte ab welchem Satz aus der DBF in die neue Datei übertragen wird. Dann weiß ich das ich beim 2.Durchlauf in der DBF dahin springen muß um dann zu sagen:"mache den Rest und date up"
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:54
von Manfred
das ist alles Kappes, ich glaube ich löse das anders. Das läuft ja nur 1x in der Nacht und dann dauert es halt ein paar Sekunden länger. Ich durchlaufe danach die Fahrzeuge und prüfe nach, was ich an letzten Einträgen im Tankbuch habe und vergleiche das dann mit dem KMStand. Das sollte gnügen.
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 12:55
von Marcus Herz
für so Aufgaben, suche einen Satz etc. ist die SQL Engine zuständig. Das mache ich nicht mehr 'per Hand'. Der PRG Code wird viel schlanker und überischtlicher.
Es gibt eine Regel, wie upgedatet wird, und die muss abgearbeitet werden. Optimierungen gehören in die SQL Engine. (Ausnahmen bestätigen die Regel, aber mir scheint das hier keine zu sein)
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 13:01
von Manfred
verstehe ich zwar sprachlich, aber nicht technisch.
Ich würde jetzt die Fahrzeuge ermitteln und dann das Ergebnis durchlaufen und mir zu jedem Fahrzeug die Einträge im Tankbuch anzeigen lassen. Datumsortiert, aber das letzte an den Anfang. So brauche ich nur einen Satz zu vergleichen. Dann schaue ich nach wie der KMStand ist und tausche halt aus, wenn er höher ist als bisher im Fahrzeug steht.
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 13:14
von Marcus Herz
Für mich wars ein langer Weg weg von der Satz Denkweise, wahrscheinlich bin ich nicht der einzige, dem es so ging, aber wenn es mal klick gemacht hat, wird vieles so viel einfacher.
So wie ich es verstehe, ist in einer 2. Tabelle immer der letzte KM Stand gespeichert:
Code: Alles auswählen
update <kmstandtabelle> set kmstand = t.kmstand
from <kmstandtabelle>
left join (select kfznr, max(kmstand) as kmstand from tankbuch group by 1) t on t.kfznr = <kmstandtabelle>.kfznr
where kmstand <> t.kmstand
Eigentlich ist es nicht relevant, ob sich der Wert geändert hat. Er muss übereinstimmen
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 13:33
von Marcus Herz
Manfred, was machst du eigentlich, wenn ein Auto ausgetauscht wird, aber wieder das gleiche Kennzeichen bekommt?
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 13:55
von Manfred
sagen wir mal so, es ist immer der letzte Eintrag zu dem Fahrzeug. Davor stehen unbegrenzt viele ältere. Und größer muß er sein, weil zwischendurch evtl. noch von woanders ein KM Stand herkommen kann, der dann evtl. höher ist als der letzte Tankstand. Oder falls mal jemand den KMStand falsch eingegeben hat. Wobei ich das nicht weiß, ob das händisch gemacht wird, oder ausgelesen wird.
Re: suchen und anhängen
Verfasst: Mo, 26. Jul 2021 13:56
von Manfred
Die Fahrzeuge werden intern nummeriert und haben einen QR-Code mit dem sie gescannt werden. Was das evtl. für Probleme noch geben kann wird die Zukunft zeigen. Noch ist das System erst in der Mache.