PDA

Vollständige Version anzeigen : Nummern zuweisen


dancer1970
23.09.2003, 13:39
Hallo,
in einer bestehenden befüllten Tabelle möchte ich Behälternummern nachpflegen. Das möchte ich möglichst einfach in einem Rutsch machen.
In leeren Felder in der Spalte MGB_BEHAELTERNR der Tabelle MGB_KATASTER sollen Werte wie BA001, BA002... usw. stehen.
Habe mir da inzwischen folgendes zusammengebastelt.
In der Zeile - RS_US.AddNew 'füge neuen DS hinzu - kann aber ja etwas nicht stimmen, da ich ja keinen neuen Datensatz anfügen möchte.
Wie mache ich das richtig?

Stefan

Abfrage:
SELECT MGBKATASTER.KEYNR, MGBKATASTER.MGB_KEY_AUFSTELLADR_ADR, MGBKATASTER.MGB_KEY_BEA, MGBKATASTER.MGB_BEHAELTERNR, new_ba_nummer() AS neue_nummer, IIf([MGB_BEHAELTERNR] Is Null,"BA" & Format([neue_nummer],"000"),[MGB_BEHAELTERNR]) AS neue_nummer2
FROM MGBKATASTER
WHERE (((MGBKATASTER.MGB_KEY_BEA)=920));


Modul1

Function new_ba_nummer()
Dim nummer_von As String, nummer_bis As String
Dim dbs As Database
Dim RS_US As Recordset
Dim strSQL1 As String
Dim i As Double
Dim j As Double

nummer_von = 1
nummer_bis = anzahl_ba_nummer


strSQL1 = "select * From abf_ba"
Set dbs = CurrentDb
Set RS_US = dbs.OpenRecordset(strSQL1)

j = nummer_von
For i = nummer_von To nummer_bis
RS_US.AddNew 'füge neuen DS hinzu
RS_US!nummer = i
RS_US.Update 'schreibt Änderungen ins recordset zurück
Next i

RS_US.Close ' schließe rs
dbs.Close 'schließe db

End Function

Function anzahl_ba_nummer()
Dim db1 As Database
Dim rs1 As Recordset
Dim strSQL1 As String
Dim lngDsAkt As Long
DoCmd.SetWarnings False
strSQL1 = "SELECT Count(*) AS AnzDS FROM abf_ba;"

Set db1 = CurrentDb
Set rs1 = db1.OpenRecordset(strSQL1)
If rs1.BOF And rs1.EOF Then
anzahl_ba_nummer = rs1!AnzDs
' MsgBox "Kein Datensatz gefunden !!"
Else
anzahl_ba_nummer = rs1!AnzDs
' MsgBox rs1!AnzDS & " gefunden"
End If
rs1.Close
Set db1 = Nothing
End Function

s.koni
23.09.2003, 13:47
Habe ich dich richtig verstanden, du möchtest die vorhandene Tabelle durchlaufen und nach leeren Feldern suche und diese mit BA und einer laufenden Nummer versehen?

Du kannst das recht einfach machen (vorrausgesetzt ich habe es verstanden.)


Function new_ba_nummer()
Dim nummer_von As String, nummer_bis As String
Dim dbs As Database
Dim RS_US As Recordset
Dim strSQL1 As String
Dim i As Double
Dim j As Double

i = 1

Set dbs = CurrentDb
Set RS_US = dbs.OpenRecordset("Tabellenname")
RS_US.MoveFirst
do while not RS_US.EOF
if not len(RS_US(Feldnummer des gesuchten Datensatzes))<>0 then
RS_US.Edit
RS_US(Feldnummer des gesuchten Datensatzes)="BA" & i
RS_US.Update
i = i + 1
end if

Loop

RS_US.Close ' schließe rs
dbs.Close 'schließe db

End Function



Die Tabelle wird duchlaufen; Wenn in dem Feld kein Eintrag vorhanden ist (Länge nicht glößer als 0) dann wird BA & Laufende Nummer eingetragen.

Hoffe ich habe dich richtig verstanden

dancer1970
23.09.2003, 14:24
Danke Koni, Du hast es schon richtig verstanden.
Bin inzwischen auch etwas weiter gekommen.

Function new_ba_nummer()
Dim nummer_von As String, nummer_bis As String
Dim dbs As Database
Dim RS_US As Recordset
Dim strSQL1 As String
Dim i As Double
Dim j As Double

nummer_von = 1
nummer_bis = anzahl_ba_nummer


' hier fängt der Code zur Erzeugung der Nummern an
strSQL1 = "select * From abf_ba"
Set dbs = CurrentDb
Set RS_US = dbs.OpenRecordset(strSQL1)

j = nummer_von
For i = nummer_von To nummer_bis
RS_US.Edit 'füge neuen DS hinzu
RS_US!neue_nummer = i
RS_US.Update 'schreibt Änderungen ins recordset zurück
Next i

RS_US.Close ' schließe rs
dbs.Close 'schließe db

End Function


Dein Code ist meinem sehr ähnlich.
Ich bekomme in der Zeile RS_US!neue_nummer = i
die Meldung: Element in dieser Auflistung nicht gefunden.

Du hast an der Stelle Feldnummer.. stehen.
Welche Bedeutung hat diese Zeile und was muß da drin stehen?

Stefan

dancer1970
23.09.2003, 15:43
Hat denn keine `ne Idee was für -Feldnummer des gesuchten Datensatzes- eingetragen werden muß?

s.koni
23.09.2003, 21:17
hy dancer1970,

glaube ich habe dich da wohl etwas verwirrt. In den Klammern des Codes muß die Nummer der Feldauflistung eingegeben werden. Also Angenommen du hast eine Tabelle die T_Muster heißt und 5 Felder hat, dann ist das erste Feld T_Muster(0), das zweite Feld T_Muster(1), usw. Der Vorteil ist, das du nicht den Feldnamen angeben mußt sondern die Feldauflistung verwendest. Die Online-Hilfe gibt dazu auch noch eine Hilfe, falls es noch nicht ganz klar ist.

Was machst du eigentlich in deinem Code mit dem SQL-String? Meines Erachtens brauchst du das gar nicht. Du kannst auch direkt auf die Tabelle verweisen und dort die Datensätze duchlaufen.


Function new_ba_nummer()
Dim dbs As Database
Dim RS_US As Recordset
Dim i As Double

i = 1

Set dbs = CurrentDb
Set RS_US = dbs.OpenRecordset("Tabellenname")
' Hier muß der Tabellenmane eingetragen werden. Anstelle des SQL-Strings wird direkt die Tabelle angesprochen
RS_US.MoveFirst ' Hier wird auf den ersten Datensatz gesprungen

do while not RS_US.EOF
'Beginn der Schleife solange nicht der letzte Datensatz erreicht wurde

if not len(RS_US(Feldnummer des gesuchten Datensatzes))<>0 then
' Wenn die Länge des Eintrages in dem Feld nicht größer als 0 ist, dann
RS_US.Edit ' Wird der Feldeintrag editiert
RS_US(Feldnummer des gesuchten Datensatzes)="BA" & i ' und mit "BA" und dem Wert der Variable i gefüllt
RS_US.Update ' Speichern der Tabelle
i = i + 1 ' Wert vom i um 1 erhöhen
end if
RS_US.Move Next ' nächtser Datensatz der Tabelle (Hab ich vorhin wohl vergessen) :eek:
Loop ' Schleife weiter

RS_US.Close ' schließe rs
dbs.Close 'schließe db

End Function


Ich hoffe du kommst damit weiter!
mfg
s.koni

racoon0506
23.09.2003, 22:02
RS_US(Feldnummer des gesuchten Datensatzes) hat die gleiche Bedeutung wie RS_US.Fields(x)
RS_US.Fields(1) entspricht der zweiten Spalte des Recordsets. (0 der ersten.)
Alternativ:
RS_US!Feldbezeichnung <- hier sollte die Bezeichnung der Spalte stehen, so wie sie in der Tabelle/Abfrage steht!
Wenn das Feld also MGB_BEHAELTERNR heisst, dann sollte hier auch
RS_US!MGB_BEHAELTERNR stehen.

Du wolltest die Nummern als BA001 usw vergeben.
Mit RS_US(Feldnummer des gesuchten Datensatzes)="BA" & i
dürfte das Ergebnis allerdings "BA1" sein
demnach
... ="BA" & Format (i, "000")
oder nur die Zahl speichern und das Format lediglich zum Darstellen als "BAxxx" im Form/Bericht verwenden.

Nach dbs.Close dann noch
Set RS_US=Nothing
Set dbs=Nothing

dancer1970
24.09.2003, 09:34
Danke für Eure Erklärungen.

Wenn ich den folgenden geänderten Code laufen lassen schmiert Access ab.

Ich starte den Code folgendermaßen:

Private Sub Befehl0_Click()
DoCmd.OpenQuery "abf_BA", acNormal, acEdit
Call new_ba_nummer
DoCmd.Close acQuery, "abf_BA"
End Sub




Function new_ba_nummer()
Dim dbs As Database
Dim RS As Recordset
Dim i As Double

i = 1

Set dbs = CurrentDb
Set RS = dbs.OpenRecordset("abf_BA")
RS.MoveFirst
Do While Not RS.EOF
If Not Len(RS(3)) <> 0 Then
RS.Edit
RS(3) = "BA" & Format(i, "000") '3 = 4.Spalte MGB_BEHAELTERNR
RS.Update
i = i + 1
End If

Loop

RS.Close ' schließe rs
dbs.Close 'schließe db
Set RS = Nothing
Set dbs = Nothing

End Function


Zum Hintergrund könnte noch wichtig sein, dass abf_BA ein Abfrage ist, die aus der verknüpften ORACLE Tabelle MGBKATASTER ca. 350 Datensätze herausfiltert.
Was mache ich da denn nun falsch?

Stefan

dancer1970
24.09.2003, 12:52
Habe inzwischen die Lösung gefunden:


Function new_ba_nummer()
Dim dbs As Database
Dim RS As Recordset
Dim i As Double

i = 1

Set dbs = CurrentDb
Set RS = dbs.OpenRecordset("abf_BA")
RS.MoveFirst
Do While Not RS.EOF

If IsNull(RS!MGB_BEHAELTERNR) Then
RS.Edit
RS!MGB_BEHAELTERNR = "BA" & Format(i, "000")
RS.Update
i = i + 1
End If

RS.MoveNext

Loop

RS.Close ' schließe rs
dbs.Close 'schließe db
Set RS = Nothing
Set dbs = Nothing

End Function


Das mit len hat aus irgendwelchen Gründen nicht geklappt.

Danke Stefan