Datenaktualisierung in MDB aus dBASE

  • VB.NET

Es gibt 91 Antworten in diesem Thema. Der letzte Beitrag () ist von markusbreitenstein.

    Datenaktualisierung in MDB aus dBASE

    Hallo Forum

    Ich habe folgendes Problem:

    Ich habe in Access einen SQL gemacht, mit welchem ich Daten aus verschiedenen DBF Tabellen ind eine ACCESS-MDB schreiben kann, welche ich in einem Tool nutzen will.
    Ein Formular konnte ich im Visual Basic erstellen, nun möchte ich per Knopfdruck den SQL den ich im Access nutze im Formular nutzen.

    der SQL lautet wie folgt:

    INSERT INTO PROGNOSE ( ART_CODE, TOTMENGE, START, ENDE, ANZAHL, INTERVALL, STUECKZAHL, PR_DATUM, PR_MENGE, STATUS, NAME1, L_BESTAND ) IN 'K:\KWAG.MDB'SELECT LR_HIST.ART_CODE, Sum(LR_HIST.MENGE) AS TOTMENGE, First(LR_HIST.DATUM) AS START, Last(LR_HIST.DATUM) AS ENDE, Count(LR_HIST.DATUM) AS ANZAHL, Int((Last([DATUM])-First([DATUM]))/Count([DATUM])) AS INTERVALL, Int(Sum([MENGE])/Count([DATUM])) AS STUECKZAHL, Last([DATUM])+Int((Last([DATUM])-First([DATUM]))/Count([DATUM])) AS PR_DATUM, Int((Last([MENGE])+Int(Sum([MENGE])/Count([DATUM])))/2) AS PR_MENGE, IIf(Int((Last([MENGE])+Int(Sum([MENGE])/Count([DATUM])))/2)<[L_BESTAND],"ab Lager",IIf((Last([DATUM])+Int((Last([DATUM])-First([DATUM]))/Count([DATUM])))<Date(),"Sofort",IIf((Last([DATUM])+Int((Last([DATUM])-First([DATUM]))/Count([DATUM])))<(Date()+7),"Dringend","Planung"))) AS STATUS, ARTIKEL.NAME1, BESTAND.L_BESTANDFROM ((dBASE III;DATABASE=K:\BAS\;username=SP;password=spedi) ARTIKEL LEFT JOIN (dBASE III;DATABASE=K:\BAS\;username=SP;password=spedi) LR_HIST ON ARTIKEL.CODE = LR_HIST.ART_CODE) LEFT JOIN (dBASE III;DATABASE=K:\BAS\;username=SP;password=spedi) BESTAND ON ARTIKEL.CODE = BESTAND.ART_CODEWHERE (((ARTIKEL.BEST_NR) Like "APPENDIX") AND ((LR_HIST.DATUM)>Date()-720) AND ((LR_HIST.DOK_CODE) Like "L*"))GROUP BY LR_HIST.ART_CODE, ARTIKEL.NAME1, BESTAND.L_BESTANDORDER BY LR_HIST.ART_CODE;

    Ich bin absoluter neueinsteiger in VB... also ned zuviel erwarten. Access hatte ich im Griff, aber das ziel ist eine eigenständige EXE-Datei, damit wir nicht auf jedem PC ein Access benötigen.

    Hoffe mal, es kann jemand helfen.

    Mit der suche habe ich leider nichts gefunden, wahrscheindlich suche ich falsch.....
    Am lernen...
    also zur Klärung - ich verstehe so:
    Du hast im Access-FrontEnd obige Monster-Query zurechtgemacht, und die tut, was sie soll.

    Nun willst du dieselbe Query von vb.net aus ausführen - ohne das Access-Frontend?

    Jo, dazu zunächstmal eine Connection erstellen, dann ein Command mit dem Query-Text und der Connection, dann die Connection öffnen, und das Command mit .ExecuteNonQuery abfahren.
    Zu den Stichworten sollten sich auch Beispiele googeln lassen.

    ErfinderDesRades schrieb:

    also zur Klärung - ich verstehe so:
    Du hast im Access-FrontEnd obige Monster-Query zurechtgemacht, und die tut, was sie soll.

    Nun willst du dieselbe Query von vb.net aus ausführen - ohne das Access-Frontend?

    Jo, dazu zunächstmal eine Connection erstellen, dann ein Command mit dem Query-Text und der Connection, dann die Connection öffnen, und das Command mit .ExecuteNonQuery abfahren.
    Zu den Stichworten sollten sich auch Beispiele googeln lassen.


    Genau richtig... die connection zur MDB klappt, das mit der Connection zur DBF bekomm ich nicht gebacken... bin am rumbasteln mit den Tips von oben, aber stehe im moment an...

    trozdem vielen Dank für alles bislang gesagte... versuche es zu verstehen...
    Am lernen...

    ErfinderDesRades schrieb:

    Das ist im Kern ja nur ein ConnectionString. Da gibts eine Site, die heisst ConnectionString.com, da findet man eiglich alle.


    sieht bei mir jetzt so aus:

    <connectionStrings>
    <add name="Prognose_PPS.My.MySettings.KWAG" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BAS\KWAG.MDB"
    providerName="System.Data.OleDb" />
    <add name="Prognose_PPS.My.MySettings.DBF" connectionString="Provider=VFPOLEDB.1;Data Source=C:\BAS"
    providerName="System.Data.OleDb" />
    </connectionStrings>

    mal sehen ob ich den Rest auch noch finde...
    Am lernen...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „markusbreitenstein“ ()

    ErfinderDesRades schrieb:

    Das ist im Kern ja nur ein ConnectionString. Da gibts eine Site, die heisst ConnectionString.com, da findet man eiglich alle.


    So.. habe es also mal hinbekommen, das ich die DBF als Tabelle im VS anzeigen kann.... und schon der nächste ärger...

    Im access konnte ich in der Abfrage felder berechnen, was er hier partout nicht zulassen will. muss ich das in der Abfrage oder dann im Form mit der Tabelle machen ?
    Am lernen...

    ErfinderDesRades schrieb:

    echt nicht? ich dachte

    SQL-Abfrage

    1. Select (Salary * 2) As Sal From Employee
    hätte ich gedacht, dass das geht.

    Muss doch auch iwo eine Doku zum Access-Sql geben.


    Hallo Erfinder

    Das mit der Klammer war die Lösung für fast alle Probleme ;) blos die Argumente first und last aus access kennt visual Studio ned, ebenso hat er die iff anweisung nicht geschluckt... aber das konnte ich umgehen. auch der import in eine mdb hat sich erledigt, da ich die benötigten daten dirckt verknüpfen konnte. die Daten liegen auf einem Netzlaufwerk, aslo sollte es dann von jedem PC aus gehen.....

    einige andere dinge habe ich auch hinbekommen, es geht also vorwärts.... ein letztes Problem bleibt jedoch bestehen....

    ich habe in Form1 ein Controlset, wo ich einen Wert auslesen und an Form2 übergeben kann, das klappt ( Wert ist DIM filter1 As String ; filter1.Text = ControlSet1 )... nun möchte ich aber, das die Table in Form 2, welche die daten aus DataSet1 bezieht mit einer where-Klausel die daten Filtert... wenn das klappt, ist meine erste Anwendung fertig :)

    Danke für deine bisherige Hilfe, toll, das es noch solche Leute gibt
    Am lernen...

    ErfinderDesRades schrieb:

    markusbreitenstein schrieb:

    nun möchte ich aber, das die Table in Form 2, welche die daten aus DataSet1 bezieht mit einer where-Klausel die daten Filtert.
    Ja, und?

    Besteht da ein besonderes Problem?


    Für mich als Access Kind schon. da konnte ich einen direkten Verweis in der Abfrage des Berichtes oder Formulares anwenden.
    Den Wert kann ich im Form2 anzeigen, aber wenn ich im DataSet1 in der Where-Klausen den "FILTER1" einsetze sagt er, das er das Objekt nicht finden kann.
    Ich vermute mal, das ich das Objekt "FILTER1" an der falschen stelle definiere und er es darum zu spät findet... oder muss ich den ganzen SQL in das Form2 packen und dann die Tabelle erstellen ohne DataSet1 zu benutzen ?

    Wie gesagt, anfänger ......
    Am lernen...
    Filter1 scheint ein Objekt zu sein, was du im Access-FrontEnd erstellt hast.
    Keine Ahnung, was das für ein Objekt ist, und ob das von Vb.Net aus zugreifbar.
    AFaik kann man von vb.net auf Tabellen und Views der Datenbank zu greifen.
    Evtl. auch auf stored Procedures, aber das müsst eine Neuerung sein, zu meiner Zeit hat Access StoredProcedures noch nicht unterstützt.

    Also was ist Filter1 für ein Objekt: View, Tabelle, StoredProc?

    ErfinderDesRades schrieb:

    Filter1 scheint ein Objekt zu sein, was du im Access-FrontEnd erstellt hast.
    Keine Ahnung, was das für ein Objekt ist, und ob das von Vb.Net aus zugreifbar.
    AFaik kann man von vb.net auf Tabellen und Views der Datenbank zu greifen.
    Evtl. auch auf stored Procedures, aber das müsst eine Neuerung sein, zu meiner Zeit hat Access StoredProcedures noch nicht unterstützt.

    Also was ist Filter1 für ein Objekt: View, Tabelle, StoredProc?


    "FILTER1" ist ein wert aus Form1, den ich in einem ComboBox abholen kann, da stehen 4 Werte zur Auswahl.
    In Form2 möchte ich nun die Tabelle anzeigen, bei der die Daten aus DataSet1 gefiltert werden und zwar "where best_nr= FILTER1" ...

    wenn ich dieses aber im DataSet so eingebe muckt er rum, weil er FILTER1 nicht kennt, also vermute ich, am falschen Ort definiert...

    kann ich die Definition für eine Abfrage direkt in Form2 integrieren und anzeigen ? weil da kennt er ja FILTER1....
    Am lernen...

    ErfinderDesRades schrieb:

    ich kann mir nicht vorstellen, was du mit

    markusbreitenstein schrieb:

    wenn ich dieses aber im DataSet so eingebe
    meinst

    in ein Dateset kann man nichts eingeben. Ein User kann in Controls was eingeben.


    Jetzt steh ich richtig auf dem Schlauch.....
    Mein Ziel:

    Form2 mit einer Tabelle, die aus einer Abfrage kommt, welche besagten "FILTER1" benutzt...
    Am lernen...
    Du hast meine Frage nicht beantwortet

    markusbreitenstein schrieb:

    Also was ist Filter1 für ein Objekt: View, Tabelle, StoredProc?
    Darauf "antwortest" du:

    markusbreitenstein schrieb:

    "FILTER1" ist ein wert aus Form1
    "wert" ist aber weder eine View, noch eine Tabelle, noch eine StoredProc.

    Tatsächlich habich keine Ahnung, was du dir unter "Wert" vostellst.

    guck: 5 - das ist auch ein Wert.
    Der Wert ist der Inhalt der ComboBox, siehe unten:

    Public FILTER1 as String

    FILTER1 = ComboBox1.SelectedItem
    Me.Hide()
    artikelliste.Show()

    Wenn ich das Form2 (artikelliste) öffne, zeigt er mir den Wert auch an :

    Me.Label1.Text = "Folgender Katalog wurde ausgewählt: " & Index.FILTER1

    Wenn er jetzt die Tabelle füllt, muss ich ihm FILTER1 als parameter zur DataSet angeben.. aber weiss nicht wo:

    teil aus der SQL : HAVING (artikel.best_nr = ?)

    wenn ich im Abfragegenerator teste, funktioniert es, wenn ich zum beispiel APPENDIX einsetze, dann werde die entsprechenden Felder ausgegeben.
    Wenn ich die Tabelle im Form2 anzeigen will

    'DataTable2TableAdapter
    '
    Me.DataTable2TableAdapter.ClearBeforeFill = True

    bleibt sie leer, weil ich nicht weiss, wo ich den Parameter übergeben muss...

    verständlich ?
    Am lernen...
    aha. Filter1 ist also einfach ein String, ist nix in deiner Datenbank.

    Und wenn ich richtig verstehe möchtest du Daten filtern.

    Da gibts 2 Möglichkeiten, die schwierige zuerst: Man kann die Daten im Dataset löschen und neu abrufen, und dabei ein SqlCommand verwenden, was mittels Where-Klausel filtert.

    Die einfache: Man kann einer BindingSource einen Filter-Ausdruck zuweisen.
    Das setzt allerdings 2 Dinge vorraus:
    1. Man verwendet BindingSources - vorzugsweise mit Databinding
    2. Die Daten sind bereits abgerufen, nur sind es zuviele - deswegen will man ja filtern.
    Also zu letzterem habich Tutorial gemacht: DataExpressions: Filter und berechnete Spalten im Dataset