MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 14.05.2018, 08:14   #1
Christian Janik
Neuer Benutzer
Neuer Benutzer
Traurig Acc2010 - Recordset in Tabelle einfügen

Hallo zusammen,
ich habe hier eine Sub mit der ich die Daten aus einem Recorset in eine Tabelle einfügen will. Irgendwie funktioniert das nicht. Bis zur MsgBox habe ich die Daten (VertragDaten) bloß einfügen will er die Daten nicht. Wo ist mein Fehler?

Gruß Christian

Private Sub LeereTabelle(VertragDaten)
Dim db As dao.Database
Dim rs As dao.Recordset

MsgBox VertragDaten

Set db = CurrentDb
Set rs = db.OpenRecordset("tbl_vertraege", dbOpenDynaset)

Do Until VertragDaten.EOF

rs.AddNew
rs!vsnr = "123456"
rs!bez_kr = VertragDaten!bez_kr
rs!bvtr_nr = VertragDaten!bvtr_nr

VertragDaten.MoveNext
rs.Update

Loop
End Sub
Christian Janik ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2018, 08:24   #2
trekking1
MOF Profi
MOF Profi
Standard

Hallo Christian,

warum fügst Du die Daten nicht per INSERT und execute ein?

Ist zwar für was anderes gedacht aber in dem Beispiel siehst Du wie das geht
http://dbwiki.net/wiki/Access_Design...L_oder_Execute

SQL läuft schneller als Recordsest und ist die Sprache der Datenbanken zum schreiben, lesen und verändern von selbigen.

Beachtest Du noch das:
http://dbwiki.net/wiki/Access_Anf%C3..._von_Variablen

dann klappts auch mit den Werten.

Viele Grüße
trekking
trekking1 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2018, 08:28   #3
Joss
MOF Profi
MOF Profi
Standard

Hallo Christian,

erstelle ein Formular mit der Tabelle (oder Abfrage?) tbl_vertraege als Datenbasis, und in diesem Formular fügst du die Vertragsdaten ein.

Gruß
Josef
Joss ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2018, 08:58   #4
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

Wo ist mein Fehler?

EINEN Fehler zu identifizieren fällt schwer. Da stecken mehrere drin, und das ganze Konstrukt ist unlogisch.

Code:

Do Until VertragDaten.EOF
Hier würde man ein Recordset vermuten. Zuvor ist aber ein ganz anderes deklariert und initialisiert. Da kommt also etwas vom Himmel gefallen, und es könnte sein, dass der VBA-Interpreter das auch nicht versteht.

Auch gravierend: Schleife ohne MoveNext, das bedeutet eine Endlosschleife.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2018, 15:31   #5
Christian Janik
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Traurig

Hallo nochmal und erst einmal vielen dank für die Antworten. Ich komme aber doch nicht weiter, vielleicht auch aus Umvermögen in Sachen Programmierung. Ich versuche mein Problem mal genauer zu beschreiben:
1. Ich baue eine Verbindung zu einem SQL Server auf und lese dort eine View aus. Das sieht so aus und funktioniert auch:

Sub verbinde()
Dim ConnectionString As String
Dim Server As String
Dim User As String
Dim Pwd As String
Dim DatabaseName As String
Dim Conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim a As String
Dim b As String
Dim strSQL As String
Dim Vertragdaten As Recordset

Server = "########"
User = "#########"
Pwd = "##########"
DatabaseName = "#######"

ConnectionString = "Provider=SQLNCLI10;Driver=SQL Server Native Client 10.0;" & _
"Server=" & Server & ";Database=" & DatabaseName

Set Conn = New ADODB.Connection
Conn.CursorLocation = adUseClient
Conn.Mode = adModeShareDenyNone
Conn.Open ConnectionString, User, Pwd
strSQL = "SELECT * FROM ###.#####"
Set rst = CreateObject("ADODB.RecordSet")
rst.Open strSQL, Conn

MsgBox rst.GetString

Conn.Close
Call LeereTabelle(rst)
End Sub


In der MsgBox lasse ich zur Kontrolle anzeigen ob ich die Daten habe. Das passt auch. Jetzt kommt der zweite Schritt.

2. Jetzt möche ich die Daten aus dem Recordset in eine Accesstabelle einfügen. Das funktioniert noch nicht. Ich habe die Sub jetzt auf das nötigste abgespeckt damit ich besser testen. Meine Problem ist halt wie ich das Recordset bzw. die Inhalte ansprechen muss um sie in die Tabelle einfügen zu können.

Private Sub LeereTabelle(rst)
Dim db As dao.Database
Dim rs As dao.Recordset


Set db = CurrentDb
Set rs = db.OpenRecordset("tbl_LeereTabelle", dbOpenDynaset)

rs.AddNew
rs!vsnr = "1648730999"
rs!bez_kr = "Hier kommt Text hin"

rs.Update

End Sub


Wenn ich die Werte vorgebe trägt er sie ein. Ich bin also schon auf dem richtigen Weg meine ich. Aber es klemmt gerade bei mir

Grüße Christian
Christian Janik ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2018, 16:38   #6
Beaker s.a.
MOF Koryphäe
MOF Koryphäe
Standard

Code:

rs!vsnr = rst!einFeld
oder nicht?

__________________

--
S.M.I.²L.E.
Beaker s.a. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2018, 17:50   #7
hcscherzer
MOF Guru
MOF Guru
Standard

In der Prozedur verbinde() sollte eine Schleife rein, die das ADODB Recordset abarbeitet. Aber die Konstruktion insgesamt ist doch sehr holprig ...

conn wird geschlossen, das rst bleibt offen.
Die Sub-Prozedur wird aufgerufen, nachdem die Connection geschlossen wurde.

Wenn Du im Laufe einer Sitzung mehrere ADODB Verbindungen öffnen willst / musst, macht es Sinnn, das Öffnen der Connection vom Öffnen des Recordset zu trennen.

Code:

Public Function open_ado() As ADODB.Connection
Dim conn_str As String, drv As String, srv As String, db As String, uid As String, pwd As String, prt As String
Dim conn As New ADODB.Connection

    drv = "_DRV"
    srv = "_SERVER"
    db = "_DB"
    uid = "_USER"
    pwd = "_PWD"
    prt = "3306"      ' MySQL
        
    conn_str = "Driver=" & drv & ";Server=" & srv & ";Port=" & prt & ";Database=" & db & ";user=" & uid & ";Password=" & pwd & ";Option=3;"
    conn.Open conn_str
    Set open_ado = conn
    
End Function
Eine lokale Tabelle aus der Remote befüllen ginge dann so (ohne Fehlerbehandlung und mit zwei exakt gleich strukturierten Tabellen):

Code:

Public Sub fill_local_table()
Dim sqlc As String
Dim rem_connection As ADODB.Connection
Dim rs_rem As ADODB.Recordset
Dim rs As DAO.Recordset
Dim i As Integer

    CurrentDb.Execute "delete from local_table", dbFailOnError

    Set rem_connection = open_ado()
       
    sqlc = "select * from remote_table"
    
    Set rs_rem = rem_connection.Execute(sqlc)
    Set rs = CurrentDb.OpenRecordset("local_table")
    Do While Not rs_rem.EOF
        With rs_rem
            rs.AddNew
            For i = 0 To .Fields.Count - 1
                rs.Fields(i) = .Fields(i)
            Next
            rs.Update
            .MoveNext
        End With
    Loop
    rs.Close
    rs_rem.Close

    rem_connection.Close
    Set rem_connection = Nothing
    Set rs = Nothing

End Sub

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.

Geändert von hcscherzer (14.05.2018 um 17:54 Uhr).
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.05.2018, 10:45   #8
Christian Janik
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Ups

Hallo Hans-Christian,
ich habe es jetzt so und er bringt mir die Meldung:

[Microsoft][ODBC Driver Manager] Der Datnequellenname wurde nciht gefunden, und es wurde kein Standardtreiber angegeben.

Was mache ich Falsch? Mein SQL Server Admin sagt aber der Treiber ist der Richtige.


Code:

Public Function open_ado() As ADODB.Connection

Dim conn_str As String, drv As String, srv As String, db As String, uid As String, pwd As String
Dim conn As New ADODB.Connection

    drv = "SQLNCLI10"
    srv = "########" 'hier habe ich die IP verwendet
    db = "HAGEL_PROD"
    uid = "########"
    pwd = "#######"
        
    conn_str = "Driver=" & drv & ";Server=" & srv & ";Database=" & db & ";user=" & uid & ";Password=" & pwd & ";Option=3;"
    conn.Open conn_str
    Set open_ado = conn
    
End Function
Christian Janik ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.05.2018, 11:14   #9
Nouba
MOF Guru
MOF Guru
Standard

Stelle den Connection String entsprechend des Treibers richtig zusammen.
Nouba ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.05.2018, 15:21   #10
Christian Janik
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Traurig

Hallo zusammen und vielen Dank für die Hilfestellungen bis hier hin. Ich habe jetzt den ersten Teil zum laufen gekriegt. Ist sicherlich noch verbesserungswürdig aber die Zeit sitzt mir im Nacken. Im zweiten Teil möchte ich jetzt jeden Datensatz um bestimmte Daten ergänzen und da beginnt mein Problem. Er bringt zwar kein Fehler aber er macht auch nichts Wo habe ich was falsch gemacht?

Code:

Private Sub daten_aktualisieren_Click()
Dim ConnectionString As String
Dim ConnectionStringVertreter As String
Dim DatabaseName As String
Dim DatabaseNameVertreter As String
Dim rsVertraege As DAO.Recordset
Dim rsVertreter As ADODB.Recordset
Dim rsVwExport As ADODB.Recordset
Dim strSQLVertreter As String
Dim conn As ADODB.Connection
Dim connVertreter As ADODB.Connection
Dim Server As String
Dim User As String
Dim pwd As String
Dim a As String
Dim b As String
Dim strSQL As String
Dim VertrSQL As String
Dim Vertragdaten As Recordset
Dim objFields As ADODB.Fields
Dim intLoop As Integer
Dim db As DAO.Database

Server = "'#########"

User = "#######"
pwd = "###########"


'++++++++++++++++++++++++Aufruf HAGEL_PROD+++++++++++++++++++++++++++++++++++++


DatabaseName = "HAGEL_PROD"

ConnectionString = "Provider=SQLNCLI10;Driver=SQL Server Native Client 10.0;" & _
"Server=" & Server & ";Database=" & DatabaseName

Set conn = New ADODB.Connection
conn.CursorLocation = adUseClient
conn.Mode = adModeShareDenyNone
conn.Open ConnectionString, User, pwd
strSQL = "SELECT * FROM dbo.vwExport"
Set rsVwExport = CreateObject("ADODB.RecordSet")
rsVwExport.Open strSQL, conn


'+++++++++++++++++++++++Aufruf steCommon++++++++++++++++++++++++++++++++++++++


DatabaseNameVertreter = "steCommon"

ConnectionStringVertreter = "Provider=SQLNCLI10;Driver=SQL Server Native Client 10.0;" & _
"Server=" & Server & ";Database=" & DatabaseNameVertreter

Set connVertreter = New ADODB.Connection
connVertreter.CursorLocation = adUseClient
connVertreter.Mode = adModeShareDenyNone
connVertreter.Open ConnectionStringVertreter, User, pwd
strSQLVertreter = "SELECT * FROM dbo.tblDwhVermttlrBfAkt"
Set rsVertreter = CreateObject("ADODB.RecordSet")
rsVertreter.Open strSQLVertreter, connVertreter


'+++++++++++++++++++++++Vertragsdaten kopieren++++++++++++++++++++++++++++++++

        Set db = CurrentDb
        Set rsVertraege = db.OpenRecordset("tbl_vertraege", dbOpenDynaset)
 
 rsVwExport.MoveFirst
 While Not rsVwExport.EOF
 
        rsVertraege.AddNew
        
            rsVertraege!vsnr = CDbl(rsVwExport!vsnr)
            rsVertraege!v_form_pauschal = (rsVwExport!v_form_pauschal)
            rsVertraege!bez_kr = rsVwExport!bez_kr
            rsVertraege!bez_fm = rsVwExport!bez_fm
            rsVertraege!vn_pid = rsVwExport!vn_pid
            rsVertraege!vn_name = rsVwExport!vn_name
            rsVertraege!vn_strasse_hnr = rsVwExport!vn_strasse
            rsVertraege!vn_plz_ort = rsVwExport!vn_plz_ort
            rsVertraege!vn_telefon = rsVwExport!vn_telefon
            rsVertraege!vn_fax = rsVwExport!vn_fax
            rsVertraege!vn_handy = rsVwExport!vn_handy
            rsVertraege!vn_email = rsVwExport!vn_email
            rsVertraege!bvtr_nr = rsVwExport!bvtr_nr
            
'+++++++++++++++++++++++++Vertragsdaten kopieren ENDE+++++++++++++++++++++++++
'
'                           Zweiter Teil
'
'+++++++++++++++++++++++++Vertreterdaten zuordnen+++++++++++++++++++++++++++++

rsVertreter.MoveFirst
While rsVertraege!bvtr_nr = rsVertreter!VERM_HNR_QK

       rsVertreter.Update
          rsVertraege!bvtr_name = rsVertreter!VERM_VNAM
          rsVertraege!bvtr_strasse_hnr = rsVertreter!VERM_STRASSE_HAUSNR
          rsVertraege!bvtr_plz_ort = rsVertreter!VERM_PLZ_ORT
          rsVertraege!bvtr_telefon = rsVertreter!VERM_TEL_KOMB
           
          rsVertreter.MoveNext

Wend

'++++++++++++++++++++++++Vertreterdaten zuordnen ENDE++++++++++++++++++++++++
                    
        rsVertraege.Update
        rsVwExport.MoveNext

Wend
conn.Close
End Sub
Christian Janik ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.05.2018, 16:11   #11
hcscherzer
MOF Guru
MOF Guru
Standard

Die gesamte Konstruktion ist unübersichtlich und irritierend.

Warum muss für rsVertreter eine neue Connection geöffnet werden ???

Die äußere Schleife ist soweit ok - die Daten werden von rsVwExport nach rsVertraege übertragen.

Aber in der inneren Schleife wird der aktuelle Datensatz von rsVertraege immer wieder von Daten aus rsVertreter überschrieben ... was soll das?

Und was soll das rsVertreter.Update am Anfang der inneren Schleife?
Da hat sich doch überhaupt nichts geändert an den Daten?

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.

Geändert von hcscherzer (17.05.2018 um 16:13 Uhr).
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.05.2018, 17:54   #12
markusxy
MOF Meister
MOF Meister
Standard

Zitat: von Christian Janik Beitrag anzeigen

Wo habe ich was falsch gemacht?

Wie wäre es mit debuggen?

Geändert von markusxy (17.05.2018 um 18:09 Uhr).
markusxy ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2018, 07:48   #13
Christian Janik
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo hcscherzer,
ja ich gebe zu mein Code ist verwirrend und vielleicht nicht ganz optimal aufgebaut. Dies ist zum einen meiner dünnen Erfahrung mit VBA zuzuschulden und zum anderen das kleine Zeitfenster. Ich versuche zu erklären was ich machen will.

Ich habe zwei SQL Datenbanken einmal HAGEL_PROD und einmal steCommon. Daher die zwei Aufrufe. Aus der Hagel_PROD bekomme ich Vertragsdaten die eine Kennung (6stellige Zahl) des Vertreter beinhaltet. Aus der steCommon bekomme ich jetzt die Verteterdaten. Jetzt ist das Ziel das die Vertragsdaten mit den Vertreterdaten abgeglichen werden und zwar auf Basis der Kennung des Vertreter aus der HAGEL_PROD und in die tbl_vertraege geschrieben wird.
Beim Debug sagt er mir: Kein aktueller Datensatz (Fehler 3021).

beste Grüße Christian
Christian Janik ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2018, 10:46   #14
hcscherzer
MOF Guru
MOF Guru
Standard

OK, das hatte ich übersehen, dass das zwei Datenbanken auf dem selben Server sind. Sorry.

Zitat:

Beim Debug sagt er mir: Kein aktueller Datensatz (Fehler 3021).

Das wäre freilich nett, wen Du mitteiltest, in welcher Programmzeile diese Fehlermeldung kommt.

Die letzten beiden Fragen aus #11 hattest Du ja nicht beantwortet ...

Und dann widerspricht Deine Schilderung in #13 ja allen Regeln der Normalisierung. Warum speicherst Du lokal die Verträge und die Vertreter nicht auch in zwei Tabellen?

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2018, 13:15   #15
Christian Janik
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Traurig

Hallo Hans Christian,
ja ich habe noch viele nicht optimale Stellen im Programmcode und breche auch einige Regularieren die für ein guten Programierer selbstverständlich sind. Da habe ich noch Luft nach oben .
Ich habe aber meinen Code nochmal überdacht und deine Frage aufgeriffen warum ich die Daten nicht in zwei Tabellen vorhalte und Du hast recht das wäre besser. Jetzt habe ich alles umgebaut und es läuft soweit sauber. Die Aktualisierung der Vertreterdatem mache ich jetzt über eine Aktualisierungsabfrage und das geht super.
Warum ich es vorher nicht so umsetzen wollte hatte den Grund das ich mir gedacht habe alles in einem Schritt zu machen um nur eine Tabelle mit allen Daten zu habe. Jetzt läuft es aber einwandfrei. Debug habe ich auch vorher schon, bin aber irgendwie nicht weiter gekommen. Daher hatte ich hier meine Frage platziert.
Aber es läuft jetzt. Das einzige was mir aktuell noch Probleme ist der Fehler 3022 bzgl Index, Primärschlüssel oder Beziehung... da muss iuch nochmal ran.

beste Grüße
Christian
Christian Janik ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.