Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

In Datenbank nach Wert suchen

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
vorti
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Mo, 25. Sep 2017 12:21

In Datenbank nach Wert suchen

Beitrag von vorti » Mi, 06. Dez 2017 15:48

Hallo,
kann mir jemand erklären wo bzw. warum das Array nicht gefüllt wird.

Code: Alles auswählen

select 4
if nRechnungsnr1#0

      do while nRechnungsnr1 < nRechnungsnr2
         locate for field -> rnr = nRechnungsnr1
         do while .not. Found()
            AAdd( aFehlendeRechung, str(nRechnungsnr1) )
         end do
         nRechnungsnr1++
      end do
   endif
   if Len( aFehlendeRechung ) = 0
      Ffehler()
   else
      FlisteRechnungen( aFehlendeRechung )
   endif
endif

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh » Mi, 06. Dez 2017 16:08

nRechnungsnr2 wird hier nirgends gesetzt, der Wert wird aber gleich beim ersten Do While benötigt.
Gruß
Hubert

vorti
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti » Mi, 06. Dez 2017 16:17

nRechnungsnr1 und 2 werden davor belegt, steht hier nur nicht dabei.

ramses
1000 working lines a day
1000 working lines a day
Beiträge: 759
Registriert: Mi, 28. Jul 2010 17:16

Re: In Datenbank nach Wert suchen

Beitrag von ramses » Mi, 06. Dez 2017 18:38

Dein Code einen Fehler.
Die Schlaufe nach locate wird nur durchlaufen wenn locate nichts findet und läuft dann unendlich (hängt) da sich die Bedingung .not. found() in der Schlaufe nicht ändert.

Was iat das Ziel deines Codes?

Gruss Carlo

vorti
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti » Mi, 06. Dez 2017 19:01

Die soll auch nur laufen wenn locate nichts findet.

Ziel ist folgendes. Ich habe ein Feld mit Nummern, z.B. durchgehend von 1-10 (außer die 7, die fehlt)
Und genau diese 7 will ich in diesem fall haben, also die Nr. die fehlt.

ramses
1000 working lines a day
1000 working lines a day
Beiträge: 759
Registriert: Mi, 28. Jul 2010 17:16

Re: In Datenbank nach Wert suchen

Beitrag von ramses » Mi, 06. Dez 2017 20:20

Du hast einen Fehler in deinem Code.

Code: Alles auswählen

do while .not. Found()
            AAdd( aFehlendeRechung, str(nRechnungsnr1) )
         end do   
angenommen deine 2 Parameter sind korrekt initialisiert also nRechnungsnr1 ist KLEINER nRechnungsnr2 und dir fehlt eine Nummer in diesem Bereich bleibt dein Code in der Schleife hängen bist der Speicher voll ist weil found() immer .f. bleibt. Ich vermute aber dass deine Parameter nicht korrekt sind und du deshalb schon nicht in die Schleife kommst.
Versuch doch mal das Programm im Debugger im Einzelschritt abzuarbeiten da kannst du deine Parameter prüfen.

Gruss Carlo

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10723
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: In Datenbank nach Wert suchen

Beitrag von AUGE_OHR » Mi, 06. Dez 2017 20:27

vorti hat geschrieben:
Mi, 06. Dez 2017 19:01
Die soll auch nur laufen wenn locate nichts findet.
dann überprüfe doch mal auf EOF() ... :roll:
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh » Do, 07. Dez 2017 6:37

ramses hat geschrieben:
Mi, 06. Dez 2017 20:20
Du hast einen Fehler in deinem Code.

Code: Alles auswählen

do while .not. Found()
            AAdd( aFehlendeRechung, str(nRechnungsnr1) )
         end do   
angenommen deine 2 Parameter sind korrekt initialisiert also nRechnungsnr1 ist KLEINER nRechnungsnr2 und dir fehlt eine Nummer in diesem Bereich bleibt dein Code in der Schleife hängen bist der Speicher voll ist weil found() immer .f. bleibt.
Gruss Carlo
da kann ich ramses nur zustimmen.
In dieser Situation wäre eine IF Abfrage richtig, da diese nur einmal durchlaufen wird und wieder zu locate zurück kommt.

Code: Alles auswählen

if .not. Found()
   AAdd( aFehlendeRechung, str(nRechnungsnr1) )
endif
In dieser Schleife wird ja kein erneutes locate ausgeführt, also dürfte found() nie wahr werden !
Somit müsste dein Programm sich hier aufhängen ... kann es sein, dass der code Schnipsel nicht vollständig ist ;-)
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh » Do, 07. Dez 2017 6:49

vorti hat geschrieben:
Mi, 06. Dez 2017 19:01
Die soll auch nur laufen wenn locate nichts findet.
Ziel ist folgendes. Ich habe ein Feld mit Nummern, z.B. durchgehend von 1-10 (außer die 7, die fehlt)
Und genau diese 7 will ich in diesem fall haben, also die Nr. die fehlt.
FÜr diese Aufgabe willst du also 10 mal die Datei mit Locate durchsuchen lassen ?
Das wird schnell sehr langsam, ich würde das in einem Durchgang erledigen ... wenn möglich mit dem Index vorher noch über Scope Sätze ausschließen

Code: Alles auswählen

* Scopen wenn möglich ... z.B. auf Rechnungsdatum oder von bis Rechnungsnummern ....
  aGibtEsNummern := {}
  GoTop()
  do while ! eof()
     if ! field->ID $ aGibEsNummer // falls nicht merken
        aadd(aGibEsNummer, field->ID)
     endif
     dbSkip()
  endif
* nun haben wir die Liste mit den vorhandenen IDs ...
  aSuchFehlene := {}
  for x := 1 to 10 // Grenzen Dynamisch ist besser
     if ! x $ aGibEsNummer // falls nicht merken
        aadd(aSuchFehlene, x)
     endif
  next 
  aGibtEsNummern := nil
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10723
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: In Datenbank nach Wert suchen

Beitrag von AUGE_OHR » Do, 07. Dez 2017 8:55

vorti hat geschrieben:
Mi, 06. Dez 2017 15:48

Code: Alles auswählen

         locate for field -> rnr = nRechnungsnr1
         do while .not. Found()
wenn er bei einem LOCATE nichts findet steht er auf EOF() :boxing:
gruss by OHR
Jimmy

vorti
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti » Do, 07. Dez 2017 9:03

Mein (Haupt-)Fehler ging schon bei select() los, jetzt passt alles.

Vielen Dank an alle die geholfen haben.

vorti
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti » Do, 07. Dez 2017 12:42

Ich hab nochmal ein ähnliches Problem.
Diesmal sind die SuchParameter dDatum1 u. dDatum2.
Das Problem ist nach wie vor lücken in der Zahlenreihe zu finden.

Meine Idee war erstmal alle Zahlen in ein Array zu packen.Das funzt leider nicht, da es zu viele sind.
D.h. gleich auswerten.
Nur leider habe ich keine Ahnung wie ich die Bedingung herstellen soll, dass er nur Zahlen beachtet, die das entsprechende Datum zugeordnet haben.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh » Do, 07. Dez 2017 16:03

schreibe mal bitte eine beispiel Tabelle mit Datum und Zahlen ... die Spalten auf die es ankommt und 4 bis 5 Zeilen,
deine Beschreibung ist nicht eindeutig...
Gruß
Hubert

Antworten