02. april 2002 - 15:38Der er
99 kommentarer og 2 løsninger
Indsæt en hel post i Tabel
Jeg har en TabelA, som jeg vil have lagt over i TabelB, men problemmet er at TabelB er en Sammenkædning, fra en SQL-database.
Når jeg manuelt prøver at kopire en post over i TabelB, får jeg en fejlmeddellelse der siger "Du har forsøgt at tildele null-værdien til en varialbel, der ikke er af datatypen variant" Hvad skal jeg gøre??
Er der nogen der kan skrive noget kode, hvor jeg kopiere alt fra TabelA over i TabelB(som er en sammenkædning) ??
De to Tabeller har helt de sammen felter, Den eneste forskel er at den ene tabel (tabelA) ligge på selve Access og den anden tabel (TabelB) er en sammenkædning som ligger på en SQL-database
Proaccess: Jeg har nemlig prøvet det som du siger, men der skette ikke noget. Jeg skal have smidt 113 poster ind, jeg fik dog 2 poster ind, men så skette der heler ikke mere.
Du skal jo kun modificere de felter, som ikke må være Null på SQL serveren.
Alternativt, kan du jo gå ind tabelB og ændre, så der ikke er nogle felter, som ikke må være null (undtagen de samme felter, som heller ikke må være Null i tabelA)
efter at have tænkt lidt over det, så er jeg kommet op med denne funktion, som burde kunne gøre det:
Public Sub AddRecords() 'On Error Resume Next Dim rsOld As New ADODB.Recordset Dim rsNew As New ADODB.Recordset Dim n As Integer rsOld.Open "TabelA", CurrentProject.Connection, adOpenStatic, , adCmdTable rsNew.Open "TabelB", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTable Do Until rsOld.EOF rsNew.AddNew For n = 0 To rsOld.Fields.Count - 1 Debug.Print rsOld(n); " "; If rsNew(n).Type < 50 Then If IsNull(rsOld(n)) Then rsNew(n) = 0 Else rsNew(n) = rsOld(n) End If Else If rsOld(n) = "" Or IsNull(rsOld(n)) Then rsNew(n) = " " Else rsNew(n) = rsOld(n) End If End If Next n rsNew.Update rsOld.MoveNext Debug.Print Loop rsNew.Close Set rsNew = Nothing rsOld.Close Set rsOld = Nothing End Sub
Den er kun grovtestet, så der kan godt være enkelte datatyper, som den ikke har det så godt med.
yilmas>If you send me the Script creating the table in the SQL Server then I can try to see what your problem is.
In SQL Server Enterprise Manager right click on the database which contains your table. Then choose "All Tasks" + "Generate SQL Script". In The General Tab press the Show All button and then choose the table from the list to move it to the right box. In Th eformatting slect ONLY the Create object .... checkbox. Then press OK to save the sql cript needed to create the table. You can send me this and also your Access database and I will take a look for you!
Have you created the dB through Access 2000? I havent worked with that so much, but you will be able to see IF any fields DO NOT allow NULL values and change this this ALLOW NULL values.
Hvis du bruger Access 97, skal jeg lige lave koden om, så den bruger DAO i stedet. ADODB og DAO er datamodellen, som Access bruger når den snakker med tabellerne. Tidligere var DAO standarden, nu er det ADO. Der er en del forskellige i syntaksen.
Public Sub AddRecords() 'On Error Resume Next Dim rsOld As DAO.Recordset Dim rsNew As DAO.Recordset Dim n As Integer Set rsOld = CurrentDb.OpenRecordset("TabelA", dbOpenSnapshot) Set rsNew = CurrentDb.OpenRecordset("TabelB", dbOpenDynaset) Do Until rsOld.EOF rsNew.AddNew For n = 0 To rsOld.Fields.Count - 1 Debug.Print rsOld(n); " "; If rsNew(n).Type < 50 Then If IsNull(rsOld(n)) Then rsNew(n) = 0 Else rsNew(n) = rsOld(n) End If Else If rsOld(n) = "" Or IsNull(rsOld(n)) Then rsNew(n) = " " Else rsNew(n) = rsOld(n) End If End If Next n rsNew.Update rsOld.MoveNext Loop rsNew.Close Set rsNew = Nothing rsOld.Close Set rsOld = Nothing End Sub
Det virker! :o)...Men vil du beskrive hvad dette stykke kode gøre? Jeg er nemlig først lige startet med VB:
Do Until rsOld.EOF rsNew.AddNew For n = 0 To rsOld.Fields.Count - 1 Debug.Print rsOld(n); " "; If rsNew(n).Type < 50 Then If IsNull(rsOld(n)) Then rsNew(n) = 0 Else rsNew(n) = rsOld(n) End If Else If rsOld(n) = "" Or IsNull(rsOld(n)) Then rsNew(n) = " " Else rsNew(n) = rsOld(n) End If End If Next n rsNew.Update rsOld.MoveNext Loop
Koden virker....Men jeg har et nyt problem når jeg prøver at køre den på min sammenkædede tabel. jeg få en fejlmeddelelse der siger : Kørselsfejl"3146" ODBC: Kaldet Lykkedes ikke
Før disse linier har vi jo oprettet 2 recordsets - et for hver af tabellerne. Et recordset er den måde man typisk arbejder med tabeller på i VBA.
Loop'et overfor løber så alle poster gennem i tabelA og for hver post løbes alle felter gennem (For n = 0 To rsOld.Fields.Count - 1 ... Next n) Hver felt har en datatype, som kan aflæses vha egenskaben Type. Denne egenskab indeholder en værdi mellem 0 og 512 (tror jeg nok) Hvis værdien er mindre end 50 så er feltet numerisk - hvis den er større end 50, så er den noget andet - typisk tekst/notat.
Derefter undersøger jeg om feltet er tomt og i givet fald indsætter jeg den 'tomme' værdi. Ellers indsætter jeg blot feltets egen værdi.
jeg ved ikke om du fik noget ud af dette - det er ret besværligt at forklare VBA-kode med ord. Og især denne funktion kræver for det første at man holder tungen lige i munden og at man husker at referere til de rigtige recordsets og felter m.m.
Using an ODBC connection, you tried to perform an operation on data in an ODBC data source. This error may occur when the ODBC data source is on a network drive and you aren't connected to the network. Make sure the network is available, and then try the operation again.
hmm, jeg tror ikke umiddelbart at vi kan bruge det til noget, får så har vi samme problem at den kun indsætter de 2 poster, da alle de andre bliver sorteret fra pga Null-fejl.
Prøv at indsætte en post manuelt i tabelb. Får du lov til det?
hvilken fejl fik du, da du ikke fik lov at indsætte en post? Du skal jo nok udfylde noget i alle 115 felter for at være sikker på at du ikke får null-fejlen.
hvilken fejl fik du, da du ikke fik lov at indsætte en post? Du skal jo nok udfylde noget i alle 115 felter for at være sikker på at du ikke får null-fejlen.
Yilmas>The Access table and theh SQL Server table are NOT the same! The easiest way to solve this problem IS to ensure that they are the same! You MUST alter the SQL Server table so that the text fields ALLOW NULL values. When you have done this you will be able to copy the data with YOUR original queries.
Det lyder næsten som om, du ikke har skriveret til tabellen, men så plejer den bare at sige at adgang er nægtet.
Jeg kan ikke gennemskue hvad der er galt med din forbindelse eller med SQLServeren.
Hvis du ikke engang kan få lov at indtaste en post manuelt, så kan du jo i hvert fald slet ikke få love at gøre det vha en query.
Har tabelB en primær nøgle? Hvis den ikke har det, så kan du ikke få lov at opdatere tabellen gennem Access.
Prøv evt at slette tabellen og sammenkæd den igen. Hvis den kommer frem og beder dig vælge et unikt indeks/felt, så er det vigtigt at du vælger et på den fremkomne liste!
Yilmas> LOOK at the comment I made 10:37! The two tables CAN NOT be the same!
The reason why you can copy after you enter 0 into all the empty fields is BECAUSE now no fields conatin NULL! NULL is not the same as "" (empty). So I still think you should MAKE SURE that the SQL table ACCEPTS NULL.
Jeg har lige undersøgt i CRM systemet, om det ska´ber problemmer for den post som jeg lige sat ind,..og det gøre det ikke, så jeg tænkte på at lave noget kode som satte 0 ind der hvor der er "" eller Null
Prøv men denne simple udgave af min tidligere kode:
Public Sub AddRecords() 'On Error Resume Next Dim rsA As DAO.Recordset Dim rsB As DAO.Recordset Dim n As Integer Set rsA = CurrentDb.OpenRecordset("TabelA", dbOpenSnapshot) Set rsB = CurrentDb.OpenRecordset("TabelB", dbOpenDynaset) Do Until rsA.EOF rsB.AddNew For n = 0 To rsA.Fields.Count - 1 If rsA(n) = "" Or IsNull(rsA(n)) Then rsB(n) = 0 Else rsB(n) = rsA(n) End If Next n rsB.Update rsA.MoveNext Debug.Print Loop rsB.Close Set rsB = Nothing rsA.Close Set rsA = Nothing End Sub
yilmas>Th eproblem is the data youhave in the Access table, there are fields which contain values which are NOT acceptable in the SQL (CRM) table. WHY does the Access table contain invalid information? There is more than likely a reason as to why your CRM table does NOT allow these values so it is really wrong to either place and empty string or 0 in the fields. Shouldnt you alter the Access table so as not to allow NULL values?
Der må stadig være et eller flere felter, som ikke bliver tilladt.
Det kan også skyldes at der er referentiel integritet på tabellen, således at der kun må stå værdier, som findes i andre tabeller. Det er ikke til at sige, når du ikke har adgang til SQL serveren.
Jeg tror at du er nødt til at finde ud af hvilke felter der er problematiske. Der er kun en måde, som jeg ser det, og det er den hårde måde: Begynd at oprette én ny post manuelt igen. Indtast kun noget i et felt og forsøg at gemme. Den fremkomne fejlmeddelelse fortæller dig herefter hvilket felt, som ikke må være null. Derefter udfylder du dette felt og prøver at gemme igen. Osv osv Læs grundigt den fejlmedelese som kommer hver gang. Hvis det er noget med Not null, så skal der bare stå noget. Hvis det er noget med "related records" eller "Referentiel integritet", så har du et problem, idet der så kun må stå noget, som findes i en tilhørende opslagstabel.
Vi kommer ikke meget videdere her.
Ellers må du søge prof. konsulentbistand - jeg gør det gerne, men det kommer jo til at koste 1 times tid eller 2. læs evt her: www.makeiteasy.dk
Det skal også lige siges, at TabelA har jeg fået hved udtræk af TabelB, så der skulle ikke være nogen problemmer, Men problemmet er jo at jeg slet ikke kan connecte til ODBC. Jeg hved ikke om man måske skulle skrive stien til Databasen, på en eller anden måde?
Men du HAR jo en forbindelse til tabellen! Du kan åbne tabellen og du kan redigere i den og du kan oprette. Så har du fuld forbindelse. Min kode benytter bare tabellens egen connection! Derfor har fejlen ikke noget at gøre med forbindelsen, men derimod noget med hvad SQLserveren tillader, at der står i hvert felt...
When you say that that TableB is an SQL-database do you mean an SQL SERVER from Microsoft? How can you enter data into TableB WITHOUT haveing a connection(odbc)??????
Okay, ...Min løsning vil nu være, at jeg laver det her i to dele. Den ene del hvor jeg indsætter 0 hos TabelA, hvor felterne er null,. Bagefter copiere jeg posterne over i TabelB og defter opdatere jeg felterne med "". Det ser ud som om at det er min eneste løsning
Det jeg har gort nu er, at jeg har har sat 0 in på TabelA hvor feltet er "" eller Null, derefter har jeg kopieret posterne manuelt ind i TabelB. Det jeg nu skal, er at jeg lave en update på alle de felter som har som indeholder #
Hvordan skal min SQl sætning se ud?
UPDATE TabelB SET ?? = '' WHERE ??='#'"
Eller skal jeg gøre det på en anden måde? måske den måde di gjorde, thomasjepsen
Thanks, the points is fine with me, Thomas did all the work :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
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.