07. oktober 2002 - 11:22Der er
13 kommentarer og 1 løsning
VBA script
Såfremt 200 point ikke er nok skal jeg have hjælp til at defienre denne i sharks forum. eller give de resterende på efterflg. spørgsmål.
Denne er svær at forklare men her kommer den...
Nedenstående er et eksempel!! Jeg har en tabel med 2 felter. indholdet er som flg.:
FIELD 1 FIELD 2 NSC total data test1 10.800 test2 5.000 test3 20.000 NSC F01 data test1 1.800 test2 350 test3 1.200
Det jeg ønsker er at lave et extra felt hvor indholdet er som flg. :
FIELD 1 FIELD 2 FIELD 3 NSC total data NSC total data test1 10.800 NSC total data test2 5.000 NSC total data test3 20.000 NSC total data NSC F01 data NSC F01 data test1 1.800 NSC F01 data test2 350 NSC F01 data test3 1.200 NSC F01 data
Idet der er flere end de 2 definerede ”afsnit” skal der enten være mulighed for at oprette en ”afsnit liste” eller jeg skal have mulighed for at udbygge scriptet med extra variabler. Det er ikke altid de starter med NSC… derfor forestiller jeg mig at man definerer sin EOF som en værdi.
Der kan være mindre varianter der skal justeres i scriptet / filen, hvorfor fuld point kun gives til en komplet brugbar løsning.
Efter ti år i London, Madrid, Paris og Utrecht kommer Sabios AI-fokuserede program af arrangementer om kundeoplevelser, ‘Disrupt’, for første gang til Danmark.
Du må have flere felter i din tabel. Hvis du kigger på den øverste tabel; hvordan ved du så om Test1 hører til NSC Total eller til NSC F01?
Hvis man skal lave en funktion, som indsætter Field3, så er man nødt til at sortere tabellen efter et eller andet kriterie. Og hvis man bare sorterer efter Field1, så kommer Test1 til at stå efter hinanden 2 gange....!?
ok, hvis vi antger at data er indtastet i den rækkefølge, som de skal ligge, så skal du lave en tabel kaldet "Afsnitliste", som kun har ét felt: "Afsnit" af datatypen Text Din første tabel hedder "DinTabel" Lav en forespørgsel, men denne SQL: SELECT DinTabel.Field1, DinTabel.Field2, DinTabel.Field3, Afsnitliste.Afsnit FROM DinTabel LEFT JOIN Afsnitliste ON DinTabel.Field1 = Afsnitliste.Afsnit; Kald forespørgslen for "DinQuery"
Når alt dette er på plads, så vil følgende VBA-funktion opdatere Field3 med de rigtige værdier: Public Function Opdater_NSC() Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim Afsnit As String Set cn = CurrentProject.Connection rs.Open "DinQuery", cn, adOpenKeyset, adLockOptimistic
Do If Not IsNull(rs!Afsnit) Then Afsnit = rs!Afsnit End If rs!Field3 = Afsnit rs.MoveNext Loop Until rs.EOF rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Function
for at kommentere dit første indlæg : Hvis du kigger på den øverste tabel; hvordan ved du så om Test1 hører til NSC Total eller til NSC F01?
Det havde jeg forestillet mig løst på en måde der kunne minde om dette her :
Hvis jeg nu kunne definere en tabelafsnitsliste kaldet "afsnit" der indeholdt eks. 3 variabler
field1 i afsnit :
NSC total NSC F01 HQS 0233
så ville jeg starte et script der i hovedtabellen begyndte at gennelæse field1. jeg kan jo ikke scriptet så her er et forsøg på en tanke:
private sub test() if me!field1.value <> afsnit!field1.value then field3.value = null else field3.value = afsnit!field1.value next end sub
he he... sikkert en gang vås men alligevel. Det der bekymrer mig i mit script eks. er hvordan den kan lave et multiopslag på afsnit!field1.value idet den jo ikke kun indeholder 1 record. Og såvidt jeg ved er det altid den første record der opslås såfremt andet er definereret. Der skal med andre ord vel være en form for for-next kommando her med en EOF eller ???
Jeg gik ud fra, at det var Access 2000/XP. Men hvis det er '97, så må koden se således ud:
Public Function Opdater_NSC() Dim db As Database Dim rs As Recordset Dim Afsnit As String Set db = Currentdb Set rs = db.openrecordset("DinQuery", dbopendynaset)
Do If Not IsNull(rs!Afsnit) Then Afsnit = rs!Afsnit End If rs!Field3 = Afsnit rs.MoveNext Loop Until rs.EOF rs.Close Set rs = Nothing End Function
mit modul ser sådan ud.( efter navne er rettet list til )
Public Function Opdater_NSC() Dim db As Database Dim rs As Recordset Dim Afsnit As String Set db = CurrentDb Set rs = db.OpenRecordset("Q_master", dbOpenDynaset)
Do If Not IsNull(rs!Afsnit) Then Afsnit = rs!Afsnit End If rs!Index = Afsnit rs.MoveNext Loop Until rs.EOF rs.Close Set rs = Nothing End Function
fejl på :rs!Index = Afsnit can't update. Database or object i red only.
NB. databasen er ikke exclusive åben Q_Master er Dynaset (Inconsistent Updates)
er det ikke frdi scriptet her forsøger at opdatere en værdi i en tabel ud fra q_master. jeg oplever bare altid at der ved query's med to differente tabeller i denne ikke kan fortages opdatering.
min master tabel hedder T_master i hvilken jeg har lavet et tomt "field3" til updatering af records fradet andet felt. field3 hedder bare "index" istedet fr field3 i min tabel. ( er rettet i scriptet )
Jeg opdagede en fejl, da jeg ændrede fra '2000- til '97-version. Koden skal derfor se således ud: Public Function Opdater_NSC() Dim db As Database Dim rs As Recordset Dim Afsnit As String Set db = CurrentDb Set rs = db.OpenRecordset("Q_master", dbOpenDynaset)
Do If Not IsNull(rs!Afsnit) Then Afsnit = rs!Afsnit End If rs.Edit rs!Index = Afsnit rs.Update rs.MoveNext Loop Until rs.EOF rs.Close Set rs = Nothing End Function
Det kan godt være det, som er fejlen, da DAO-metoden ('97-verionen) kræver at man sætter recordset'et i edit-mode før redigering. Det gør ADO-metoden ikke ('2000-versionen)
Prøv at åbne Q_Master og se om du kan rette direkte i forespørgslen. Hvis du IKKE kan det, så har du ret i, at det er der fejlen ligger. Og derfor skal du åbne tabellen i stedet for forespørgslen.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.