![]() |
Anzeige:
|
|
|||||||
| XProfan Alles rund um die Programmiersprache XProfan. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hallo zusammen, bin gerade wieder am schrauben & auf ein kleines Prob gestoßen, bei dem mir jetzt langsam die Ideen ausgehen:
Auf einem SQL-Server befinden sich eine Anzahl DB's, die u.a. jeweils eine Tabelle enthalten, deren Struktur identisch ist. Diese Tabellen möchte ich "einsammeln". Mit der Funktion 'LVSQL sqlbefehl, listview' kann ich ja das Abfrageergebnis direkt in ein Listview packen. Allerdings überschreibt die 2. SQL-Abfrage die bestehenden Daten im listview. OK - macht ja nichts, dann kopiere ich vor der nächsten Abfrage einfach dieses Listview in eine "Endtabelle". So, als ob ich mit einem Eimer nach & nach ein Fass fülle... Das Problem: der erste Eimer landet auch noch im Fass, alle folgenden sind nicht zu sehen. Der Clou: es werden in der Zieltabelle auch artig die entsprechenden Zeilen erzeugt - nur sie sind leer! Um den Fehler einzukreisen, habe ich dazu ein kleines Testprog geschrieben & will es hier mal zum probieren reinstellen. Es ist sofort lauffähig (Listview.dll, Listview_Funktionen.inc & Listview_Dispose.inc müssen vorhanden sein) Ich fülle hier einfach eine Quelltabelle mit Daten & versuche diese dann MEHRMALS in eine Zieltabelle zu kopieren. Ich kann aber einfach nicht den Schweinehund finden, der mir da in die Suppe k.....! Die erste Kopieraktion von 4 funzt, der Rest landet im Nirvana Code:
'testprog, um den inhalt einer tabelle mehrmals in eine andere tabelle zu kopieren
Windowstyle 543
WindowTitle " Test: ein Quell-LV MEHRMALS in ein Ziel-LV kopieren"
Window 0,0-600,800
declare lv1& 'nimmt das handle für die gesamttabelle auf
declare lv2& 'nimmt das handle für die zwischentabelle auf
declare gro& 'nimmt die speichergröße für jeweils eine zwischentabelle auf
declare speich# 'bereichsvariable für aufnahme des inhaltes der zwischentabelle
declare txt# 'bereichsvariable für die aufnahme von texten
declare lvdll&
dim txt#, 120 'speicherbereich für die aufnahme von texten reservieren
$I Listview_Funktionen.inc 'funktionen für die listview laden
lvdll&=usedll("Listview.dll") 'listviev.dll laden
'quell- & ziellistview erstellen
lv1&=CreateListView(%hwnd,%hinstance,0,-1,-1,$20) 'quelle
buildlistview(lv1&,1,20,50,0) 'eine spalte anlegen & 20 zeilen
lv2&=CreateListView(%hwnd,%hinstance,0,-1,15329769,$21)'ziel
buildlistview(lv2&,1,0,50,0) 'eine spalte anlegen
SetColumnName(lv2&,"Ziel",0) ' spaltenname für zieltabelle
'quelltabelle (lv1) mit testwerten füllen
whileloop 0,20
string txt#,0 = &loop 'momentanen &loop-wert in den bereich schreiben
setitemtext(lv1&,txt#,0,&loop)'inhalt des bereiches in der momentanen zeile von lv1 schreiben
endwhile
print "quelltabelle enthält", getlines(lv1&),"zeilen"
print
'zieltabelle mehrmals mit den werten der quelltabelle füllen
whileloop 0,3
gro& = getneededmemory(lv1&,1) 'speicherbedarf der quelle ermitteln um sie in einem bereich zu schreiben
Dim speich#,gro& 'bereichsvariable für die zuvor ermittelte größe ermitteln reservieren
listviewtoraw(lv1&,speich#) 'zwischentabelle in den reservierten speicherbereich kopieren
rawtolistview(lv2&,speich#) 'zwischengespeicherte daten aus speicherbereich in die zieltabelle anhängen
dispose speich#
print "zieltabelle enthält", getlines(lv2&),"zeilen"
endwhile
ShowListView(lv2&,300,20,70,500)'ziel-listview sichtbar machen
while 1
waitinput
if %key = 2
freedll lvdll& 'listview.dll entladen
$I Listview_Dispose.inc '
dispose txt# 'speicherbereich freigeben
dispose speich# 'speicherbereich freigeben
end
endif
endwhile
end
Jörg |
|
|
|
|
|
|
#2 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Im Listview-Paket sind Quellcodes, die Spalten oder Zeilen kopieren. Ich meine, dort benutze ich eine viel schnellere Technik. Hast du dort schonmal reingesehen?
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#3 (Direktlink) | |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Zitat:
Da ich aber im nächsten Schritt ein lokales Speichern & Laden dieser Daten plane & ich dafür ListviewToRaw/RawToListview in Verbindung mit WriteFileQuick/ReadFileQuick verwenden möchte, wäre es trotzdem sehr hilfreich zu wissen, warum mein Testprog so nicht funzt... Gruß Jörg |
|
|
|
|
|
|
#4 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Jetzt wo du es sagts glaube ich nicht mehr, dass die Technik schneller ist. Hach ich kann ja nicht jeden Code im Kopf mit mir tragen.
Heute komme ich leider nicht mehr zum Austesten.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#5 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
kein Problem, ich friemel inzwischen weiter, vllt entdecke ich was. Meine Listview.dll hat die VersionsNr. 2112; bin ich damit aktuell?
bis dann... Gruß Jörg |
|
|
|
|
|
|
#6 (Direktlink) |
|
MoRoGeP-Träger 2011
![]() Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.878
|
__________________
Gruss, horst Computer werden kleiner und kleiner, bald verschwinden sie völlig. (Ephraim Kishon 1924-2005) http://www.web-treffpunkt.de |
|
|
|
|
|
#7 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hi Horst,
das ist ja niedlich! &loop beinhaltet eigentlich den Wert, der in das Item geschrieben werden soll. Das erledigt diese Schleife: Code:
'quelltabelle (lv1) mit testwerten füllen
whileloop 0,20
string txt#,0 = &loop 'momentanen &loop-wert in den bereich schreiben
setitemtext(lv1&,txt#,0,&loop)'inhalt des bereiches in der momentanen zeile von lv1 schreiben
endwhile
Gruß Jörg |
|
|
|
|
|
#8 (Direktlink) | |
|
MoRoGeP-Träger 2011
![]() Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.878
|
@Jörg
Zitat:
Roland könnte da etwas Aufklärung geben (wenn der Steuerbescheid fertig ist
__________________
Gruss, horst Computer werden kleiner und kleiner, bald verschwinden sie völlig. (Ephraim Kishon 1924-2005) http://www.web-treffpunkt.de |
|
|
|
|
|
|
#9 (Direktlink) | |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Zitat:
Das mit dem &loop ist aber hier auch nebensächlich. Auch bei dir wird deutlich, daß zwar 80 Zeilen erzeugt wurden, aber nur 20x der Wert von der Quell- in die Zieltabelle kopiert wurde. Ich vermute, ich wende die Funktionen ListviewToRaw/RawToListview falsch an bzw sie reagieren anders, als ich erwarte. Vllt liegt das auch an der Bereichsvariablen, die scheint ja ab dem zweiten Durchlauf leer zu sein Gruß Jörg |
|
|
|
|
|
|
#10 (Direktlink) |
|
Stammuser
![]() Registriert seit: 04.04.2009
Ort: Lübeck
Beiträge: 264
|
Ich glaube das Problem ist RawToListview(lv2&,bereich#) .
Es werden nur Leerzeilen beim 2. Kopieren erzeugt. Code:
'testprog, um den inhalt einer tabelle mehrmals in eine andere tabelle zu kopieren
$I Listview_Funktionen.inc
var lvdll&=usedll("Listview.dll")
cls
var lv1&=CreateListView(%hwnd,%hinstance,0,$FFFFFF,-1,$31)
InsertColumn lv1&,"LV-1",60,0
var lv2&=CreateListView(%hwnd,%hinstance,0,$FFFFFF,-1,$31)
InsertColumn lv2&,"LV-2",60,0
var lv3&=CreateListView(%hwnd,%hinstance,0,$FFFFFF,-1,$31)
InsertColumn lv3&,"LV-3",60,0
ShowListView(lv1&,100,20,70,400)
ShowListView(lv2&,200,20,70,400)
ShowListView(lv3&,300,20,70,400)
'quelltabelle (lv1) mit testwerten füllen
whileloop 20
setitem(lv1&,str$(&loop))
endwhile
declare bereich#,text$,x&,y&,bytes&
dim bereich#,32000
ListviewToRaw(lv1&,bereich#)
RawToListview(lv2&,bereich#) '1. Einfügen
RawToListview(lv2&,bereich#) '2. Einfügen
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ über *.csv
text$="Test.csv"
x&=GetNeededMemory(lv1&,1)
Dim bereich#,x&
x&=ListviewToCsv(lv1&,bereich#,0,0)
x&=WriteFileQuick(addr(text$),bereich#,0,x&)
Dispose bereich#
bytes&=@FileSize(text$)
If bytes&>0
Dim bereich#,bytes&
ReadFileQuick(addr(text$),bereich#,0,bytes&)
CsvToListview(lv3&,bereich#,bytes&,1) '1. Einfügen
CsvToListview(lv3&,bereich#,bytes&,1) '2. Einfügen
Dispose bereich#
EndIf
while 1
waitinput
case %key = 2: BREAK
endwhile
freedll lvdll& 'listview.dll entladen
'$I Listview_Dispose.inc '
dispose bereich# 'speicherbereich freigeben
end
Gruß Thomas Geändert von THFR (28.09.2010 um 13:28 Uhr) |
|
|
|
|
|
|
#11 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
keine schlechte Idee, Thomas
Gruß Jörg |
|
|
|
|
|
#12 (Direktlink) |
|
Stammuser
![]() Registriert seit: 04.04.2009
Ort: Lübeck
Beiträge: 264
|
Bei mir gehts
Code:
x&=GetNeededMemory(lv1&,1)
Dim bereich#,x&
x&=ListviewToCsv(lv1&,bereich#,0,0)
CsvToListview(lv3&,bereich#,x&,1) '1. Einfügen
CsvToListview(lv3&,bereich#,x&,1) '2. Einfügen
Dispose bereich#
'
|
|
|
|
|
|
#13 (Direktlink) | |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Zitat:
Code:
whileloop 200
clearlistview(lv1&) 'lv1 leermachen (sonst gibs kuddelmuddel!)
sql$ = "hier wird jeweils die passende sql-Abfrage zusammengebaut"
LVSQL sql$,lv1& 'sql-abfrage ins lv1 packen
x&=GetNeededMemory(lv1&,1)
Dim bereich#,x&
x&=ListviewToCsv(lv1&,bereich#,0,0)
CsvToListview(lv3&,bereich#,x&,1) ' Einfügen
dispose bereich#
endwhile
Vielen Dank für die Hilfe! Ist die LV.dll-Version 2112 jetzt eigentlich die aktuelle? Gruß Jörg |
|
|
|
|
|
|
#14 (Direktlink) |
|
Stammuser
![]() Registriert seit: 04.04.2009
Ort: Lübeck
Beiträge: 264
|
Müßte die letzte Version sein. Beachte aber, ich glaube Frank hat die nur ab XProan 10 getestet. Ältere Versionen habe ich sonst noch liegen. Ferner würde ich prüfen ob x&>0 ist. Kann sonst vielleicht zum Abbruch führen.
Einfach mal testen. Gruß Thomas |
|
|
|
|
|
#15 (Direktlink) | |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Zitat:
Ok, ich schau mir die Raw-Funktionen mal kritisch an, sobald ich Luft habe. Vorerst scheinst du ja eine Lösung gefunden zu haben. Hab momentan leider sehr wenig Zeit. Stimmt, die aktuelle Version ist 2112.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Excel - Makro um Zeilen in andere Sheets zu kopieren | Mauli | Office-Anwendungen | 13 | 11.05.2009 16:22 |
| Daten in eine zweite Tabelle schreiben. | Pat-Man | Office-Anwendungen | 3 | 10.02.2007 10:57 |
| Datensätze in der gleichen Tabelle kopieren | dave21 | PHP/MySQL | 6 | 04.05.2005 16:13 |
| Treiber auf andere Festplatte kopieren ? | u0012 | Hardware - Problemlösungen | 5 | 27.07.2004 17:49 |