PDA

Vollständige Version anzeigen : Von Formular Änderungen aufrufen


magic1708
04.06.2012, 09:04
Hallo zusammen,

ich habe eine Datenbank für eine Angeotsverofolgung.

In einem Formular "frm_Angbearbeiten" möchte ich ein Button machen der mir mit dem klick ereigniss ein weiteres Formular öffnet hinter dem die Tabelle aller Änderungen steht.

Die Änerderungen werden immer per RS mitgeschrieben und unter der eindeutigen Belegnummer mitgeschrieben.

Ich habe ein Formular "frm_Aenderung" mit dem ich ALLE Änderugnen ansehen kann. Ich denke das man dieses nehmen kann und dann nur gefiltert öffnet.

Was ich möchte von frm_Angbearbeiten klicken um alle Änderungen zu diesem Angebot anzuzeigen.

DAnke schön

Gruß Matthias

hcscherzer
04.06.2012, 09:16
Moin Matthias,

in Deinem Bearbeitungsformular hat es doch sicherlich ein Feld, das den bearbeiteten Satz eindeutig identifiziert?
Nennen wir es id.
Und dies entspricht doch sicherlich dem Fremdschlüssel in der Tabelle mit der Änderungshistorie?
Nennen wir ihn angebots_id.
Dann sollte es vielleicht so laufen:
sub button_x_click()
docmd.openform "frm_aenderung", , , "angebots_id = " & me!id
end sub

Atrus2711
04.06.2012, 09:17
Hi,

wenn die Daten und das Formular schon vorhanden sind, brauchst du nur ein "Formularöffnen mit Kriterium" zu bewerkstelligen.

Bau im aufrufenden Formular einen Button ein, der folgenden Code enthält:
Docmd.OpenForm "ZuÖffnendesFormular", acNormal, ,"DeinTabellenFeld = " & Me!DeinFormularcontrol
An den fetten Stellen musst du anpassen. Die Bedingung am Ende muss einen Vergleich ergeben, der das Tabellenfeld in der Tabelle des öffnenden Formulars mit einem Formularfeld des buttonhaltigen Formulars vergleicht. Welches Feld das ist, weißt nur du.

magic1708
04.06.2012, 09:25
Hallo Hans Christian, Hallo Martin,

hab ich so eingebaut. Super!!

Ich habe aus der Tabelle die Bezeichnung der Spalte genommen in diesem Falle Beleg und in dem Formular frm_Aenderungen das entsprechende Feld in dem die Beleg nummer in dieser tbl steht. in diesem Falle Aenderungsort.
Private Sub cmd_aenderungen_Click()
DoCmd.OpenForm "frm_Aenderung", acNormal, , "Beleg = " & Me!Aenderungsort

End Sub

Ich bekomme nun den Fehler das er das Feld Aenderungsort nicht finden kann.

maikek
04.06.2012, 09:28
Moin,
Das Änderungsformular ist zu dem Zeitpunkt noch geschlossen und seine Felder somit nicht bekannt.
Beleg sollte ein Tabellenfeld aus der Datenherkunft von frm_Aenderung sein, den Vergleich musst du mit einem Feld machen, das auf dem Formular mit dem Button vorhanden ist.
maike

Atrus2711
04.06.2012, 09:29
Me!Aenderungsort sollte der Name des Steuerelements sein, aus dem du den anzuzeigenden Satz ermitteln willst. Das ist oft, aber nicht zwangsläufig der gleiche Name wie das Tabellenfeld im Buttonformular.

Guck also, wie das Vieh heißt, und nutze dessen Namen.

magic1708
04.06.2012, 09:35
Hallo,

für das erste nehme ich doch in dem Formular auf dem der Button ist das Tabellenfeld?! "tbl_Angebote.Beleg" Sprich Beleg

Für das 2. nehme ich den Namen des Textfeldes auf dem 2.Formular?!

In dem Falle Aenderungsort..... ??

maikek
04.06.2012, 09:40
NEIN. Genau anders herum.
Für das erste nimmst du das Tabellenfeld, das in der Datenherkunft (Tabelle/abfrage) von Formular 2 den Wert enthält.
Für das zweite nimmst du das Formularfeld, das in Formular 1 den Vergleichswert enthält.
An das zweite Formular geht dann die Information: Tabellenfeldinhalt = X (X ist dabei der Wert aus dem Formularfeld des geöffneten Formulars).
maike

Atrus2711
04.06.2012, 09:42
Es ist das gleiche Kriterium, das auch in einer Abfrage zum Zuge käme. Da muss also eine Bedingung rauskommen der Art (Illustration!): "Bestellnummer = 4711"

Private Sub cmd_aenderungen_Click()
DoCmd.OpenForm "frm_Aenderung", acNormal, , "Beleg = " & Me!Aenderungsort
End Sub
Rot = Tabellenfeld (!) in der Tabelle, die dem zu öffnenden Formular zugrundeliegt.
Blau = Formular-Steuerelement in dem Formular, das den Button enthält

magic1708
04.06.2012, 09:46
Ich denke ich habe den eigentlichen Fehler den ich mache gefunde.

Ich habe es jetzt so geschrieben wie Ihr es eigetlich meintet geschrieben.

Jetzt bekomme ich die Meldung Datentypkonflikt.... Ich könnte kotzen !!

In der tbl_Angebote natürlich Zahl .... Und in der Änderungs tbl TEXT !!!! WAAAAHHH ..... Würg.....

:-(

Atrus2711
04.06.2012, 09:49
*Spuckbeutelrüberreich* :p

Wenn du da tatsächlich die richtigen Felder verbunden hast, dann frag ich mich: warum sind die Typen unterschiedlich?

Aber es könnte Rettung in Sicht sein. Wenn das Textfeld nur die Nummer enthält, kannst du es leicht in ein Zahlenfeld umwandeln. Dann passt auch die Bedingung.

magic1708
04.06.2012, 10:33
So.....

Neue Tabelle erstellt..... und alte eingefügt... Und das alles auf dem SQL Server!!!.. BÄÄÄHH...
Naja wie sage ich immer die Basis ist das was stimmen muss.... Das passt im ganzen leben auch in Datenbanken...


Was ich aber nun habe ist bei der neuen tbl_Aenderung. In der die Felder gleich heißen.... Bekomme ich nun beim RecordSet.Update einen Fehler ODBC Aufruf Fehlgeschlagen ?!

hcscherzer
04.06.2012, 10:36
Bisher waren alle davon ausgegangen, dass das Schlüsselfeld nummerisch ist.
Falls es aber ein Textfeld ist, müssen die Konventionen bei der Parameterübergabe eingehalten werden:Private Sub cmd_aenderungen_Click()
DoCmd.OpenForm "frm_Aenderung", acNormal, , "Beleg = '" & Me!Beleg & "'"

End Sub

In der tbl_Angebote natürlich Zahl .... Und in der Änderungs tbl TEXT !!!!
Davor schützen übrigens zu Beginn angebrachte Beziehungen mit referentieller Integrität, wenn ich das mal hinzufügen darf ... ;)

Atrus2711
04.06.2012, 10:58
hast du die Server-Tabellen neu nach Access eingebunden?

magic1708
04.06.2012, 11:02
Hallo Martin,

ja hatte ich gemacht.

Ich habe aber nun erstmal folgendes geamcht! Ich habe die alte tabelle zurückgeholt (in der er Beleg als Text ist) und habe den Code entsprechend angepasst.... Sonst klingelt sich mein telefon gleich kaputt warum da andauernd fehler meldungen kommen......

Atrus2711
04.06.2012, 11:35
Du machst das alles auf einem Produktivsystem!? :upps:

magic1708
04.06.2012, 13:27
DIe Jet ist nicht Produktiv... Die kann ich mich einem Versions Update per Batch ausrollen.

DIe SQL Datenbank ist Produktiv, ja.

Die User Arbeiten mit einer Kopie der Jet auf Ihrem eigenen Laufwerk. Dieses wird dann bei bedarf von einem NetShare dahin kopiert.

Atrus2711
04.06.2012, 13:35
Moment: ist die Jet nur das Frontend, oder hast du für Entwicklerzwecke ein Jet-Backend, das dann für Produktion auf SQL-Server umgehängt wird?

magic1708
04.06.2012, 13:39
Ja das ist eine BE FE Lösung...

Ich habe das Access Frontend in dem gearbeitet wird und im Hintergrund den SQL Server

Habe ein Frontend in dem ich "rumbaue"... und wenn ich der Meinung bin das es passt erstelle ich aus diese eine ACCDE..... und lege die auf den Server und ändere meine Veriosn und schwups wird die Neue ACCDE an alle beim nächsten öffnen kopiert.....

Atrus2711
04.06.2012, 13:42
Wenn du bei diesem Konstrukt dann aber über Datentypfehler stolperst, hast du zu früh GO gegeben, vulgo zu oberflächlich getestet....

Klappt es denn jetzt?

magic1708
04.06.2012, 13:48
Das stimmt wohl.

Ich habe jetzt erstmal die Text Variante genommen. Hatte noch keine Zeit nach weiterem ausschau zuhalten.

Muss ja auch noch meiner Richtigen Abreit nachgehen :-)

Desweiteren muss ich noch den Import verändern. Hierzu hatte ich schon ein paar Anfrage gestellt, werde mir die Thread´s noch mal durchleses.

Das Problem dabei ist das die Excel Dateien zu unsauber von den Kollegen bearbeitet werden. Und im Endeffekt lauter leere Spalten importiert werden.

Letztens hatte ich einen Fall das ich ein SChüßelverletzung hatte ( Diese kommt normal wenn ein Angebot schon vorhanden ist) bei der es wohl 80 verletzungen sind und nur 30 DS importiert wurden..... Der rest waren nut leere Datensätze...

Atrus2711
04.06.2012, 13:57
Das Problem dabei ist das die Excel Dateien zu unsauber von den Kollegen bearbeitet werden
Manuelle Angaben, v.a. in Excel, sind immer als unsauber anzusehen. Daher solltest du solche Angaben nie direkt in die Zieltabellen schreiben, sondern in eine Puffertabelle einlesen und von dort aus weiterverarbeiten:

fehlende Vorratswerte (=Sätze in Tabellen auf der 1-Seite von Beziehungen) ermitteln und anfügen
fehlende oder falsche Angaben ergänzen (soweit möglich) oder zurückweisen ("Schrott!" -> nachbessern). [1]
Fremdschlüsselwerte ermitteln und in die Zieltabelle(n) eintragen.


ebs17 hat dazu im Code-Archiv eine schöne Demo geschrieben: http://www.ms-office-forum.de/forum/showthread.php?t=289028

[1] Dieses Ergebnis wird erfahrungsgemäß gerne übersehen: es gibt Mist, den man einfach nicht sinnhaft importieren kann. Workarounds und maschinelle Deutungen sind da fehl am Platz! Erfahrungsgemäß guckt kein Mensch über Daten drüber, wenn sie erst einmal "im System" stehen. Also sollten nur koschere Daten in die Datenbank reindürfen. Und Mist muss draußen bleiben, das hält auch den Erfasser in der Pflicht.

magic1708
04.06.2012, 14:09
Sowas in der Art werde ich machen.

Ich schaue mir gleich mal das vom ebs an.....

Ich denke das ich in das FrontEnd eine kleine Tabelle mache in die ich die Excel Datei importiere und von da aus dann in die dbo.tbl_Angebote einstelle...

Ich denke das ich unter einem neuen Thread noch ein paar Fragen zwecks diverser Vorgehensweisen oder Code Schnipsel erstellen.

magic1708
04.06.2012, 14:10
Das verhindern von diesen leeren Datensätzen scheint mir glaube ich das schwierigste....

Atrus2711
04.06.2012, 14:18
Im Excelsheet kannst du die eh nicht verhindern. Aber du kannst verhindern, die zu verarbeiten, und dann das Excelsheet zurückweisen.

Das Kennzeichen für leere Datensätze ist, dass Felder NULL sind:
... WHERE ErstesPflichtfeld IS NULL OR ZweitesPflichtfeld IS NULL OR ...--> diese Sätze könntest du

zählen; wenn >0, ablehnen
oder
in den Puffer einlesen und dem User aufs Brot schmieren. "diese Sätze sind untauglich: (Report). Try again!"

magic1708
04.06.2012, 14:43
Ich schreibe es mal so wie ich es mir vorstelle vielleicht können wir was zusammen basteln:

1. Excel Datei verlinken. und in die xtbl_Import die sich im FE befindet importieren.
2. Prüfen ob Daten eventl in der dbo.tbl_Angebote vorhanden sind wenn ja ausgabe in einer kleinen Datenblatt ansicht auf einem Formular... prüfen ob diese doofen leeren DS da sind und diese ignorieren Formfehler behandeln...
3. Import in die dbo.tbl_Angebote.


Ich habe nur eine Tabelle in die Importiert wird....

Atrus2711
04.06.2012, 14:56
Den Import in die xtbl_Import kriegst du hin, oder?
Die leeren Sätze kannst du in einem Formular anzeigen, das die relevanten Felder auf NULL prüft.
Exceldaten-ohne-Serverangebote erhältst du über eine Inkonsistenzabfrage, die die eingebundene Servertabelle mit der lokalen Importtabelle vergleicht. Details: Donkarl (http://www.donkarl.com?FAQ3.16)
Den Import der sauberen Sätze stößt du mit Anfgeabfragen an. Achte darauf, nur die Sätze anzufügen, die auf dem Server wirklich fehlen. Die hast du ja im vorigen Schritt ermittelt.

magic1708
04.06.2012, 15:37
zu 1 ja das bekomme ich hin ... denke ich :)
zu 2 das wird schon schwerer
zu3 NEIN
zu4 das könnte ich denke ich...

Atrus2711
04.06.2012, 15:43
1-4: probiers, und frag bei Problemen konkret nach. "Kann ich nicht, mach du mal" kostet mindestens Ansehen, ggf. Geld :)

magic1708
04.06.2012, 15:45
Schon klar... :)

Ich versuche es mal.... Ich denke das ich heute nicht mehr dazu komme...

Melde mich dann wieder :-)

Aber schon mal ein fettes Danke... das hier so eine spitzen Hilfe geleistet wird!!

Gruß Matthias

magic1708
04.06.2012, 16:38
Hallo,

zu Step 1 müsste es doch so sein als Modul:
Option Compare Database
Option Explicit

Public Function runImportNEU(ByVal DateiPfad As String) As Boolean

On Error Resume Next

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel8 _
, "ztbl_AngeboteImport", DateiPfad, True 'Import.xls in FE verlinken

CurrentDb.Execute "DELETE FROM ztbl_Angebote" 'löschen der alten Datensätze in der Puffertabelle

INSERT INTO xtbl_Import ( Bestellnummer, VKOrg, VKBür, VKGr, Auftrgeb, Angelvon, Belegdatum, Vart, Beleg, Nettowert, S, Abgesagt, erhalten, offen, Referiert, Bemerkung )
SELECT Tabelle1.Bestellnummer, Tabelle1.VKOrg, Tabelle1.VKBür, Tabelle1.VKGr, Tabelle1.Auftrgeb, Tabelle1.Angelvon, Tabelle1.Belegdatum, Tabelle1.Vart, Tabelle1.Beleg, Tabelle1.Nettowert, Tabelle1.S, Tabelle1.Abgesagt, Tabelle1.erhalten, Tabelle1.offen, Tabelle1.Referiert, Tabelle1.Bemerkung
FROM Tabelle1
WHERE (((Tabelle1.Beleg) Is Not Null)) OR (((Tabelle1.Angelvon) Is Not Null)) OR (((Tabelle1.VKBür) Is Not Null));



If Err.Number = 0 Then
runImport = True
Else
Select Case Err.Number
Case 3059
MsgBox "Sie versuchen die Daten doppelt zu importieren", vbOKOnly + vbCritical, "Fehler"

Case 3349
MsgBox "In einem Nummerischenfeld steht Text! Formatfehler", vbOKOnly + vbCritical, "Fehler"

'Case x 'Behandlung für Fehlernummer x

' Case Y 'Behandlung für Fehlernummer y

Case Else 'Behandlung für alle sonstigen Fehler

MsgBox "Import Fehlgeschlagen" & " " & Err.Number, vbOKOnly + vbCritical, "Fehler"
End Select

runImport = False
End If

End Function

Atrus2711
05.06.2012, 08:30
Hi,

das wäre ein Weg.

Ein anderer wäre, wirklich alle (!) Sätze aus Excel in die Importtabelle zu holen und dann ein Formular auf diese Importtabelle zu setzen, das anzeigt, wo es hakt. Die Impottabelle muss also wirklich "alles schlucken" und darf daher keinerlei Restriktionen haben und müsste dann auch ohne Kriterien beladen werden.

Statt der Meldung "Es gibt faule Sätze" würden diese faulen Sätze dann gezeigt. Das verleiht einen stärkeren Impetus, das dann zu ändern.... ;) Man könnte sogar die unterschiedliche Fehlerklassen durch eine Optionsbox zurechtfiltern oder fabrlich markieren.

magic1708
05.06.2012, 08:33
ich habe nur ein Problem das ich im Modul diesen Code nicht verwenden kann..

Muss ich das wie bei T-SQL machen... Mit dieser sSql sache und danach DB Execute....??

magic1708
05.06.2012, 08:33
Ein anderer wäre, wirklich alle (!) Sätze aus Excel in die Importtabelle zu holen

Habe ich das so nicht gemacht?

Atrus2711
05.06.2012, 08:38
Nein, hast du nicht. Das ist doch wohl ein Einschränkung, oder?
WHERE (((Tabelle1.Beleg) Is Not Null)) OR (((Tabelle1.Angelvon) Is Not Null)) OR (((Tabelle1.VKBür) Is Not Null));

Atrus2711
05.06.2012, 08:39
ich habe nur ein Problem das ich im Modul diesen Code nicht verwenden kann..
In VBA kannst du nicht einfach SQL-Code irgendwohin schreiben und auf dessen Ausführung hoffen.

Du hast in deinem Code beim DELETE bereits den richtigen Einsatz von SQL genutzt. Mach das beim Insert genauso.

magic1708
05.06.2012, 08:41
ACHSO

Du meinst alles rein ziehen und dann im 2. Schritt sagen was nicht stimmt... OK.

Ist das hier der richtige weg??

strSQL = "Insert Into "
strSQL = strSQL & "xtbl_Import ( Bestellnummer, VKOrg, VKBür, VKGr, Auftrgeb, Angelvon, Belegdatum, Vart, Beleg, Nettowert, S, Abgesagt, erhalten, offen, Referiert, Bemerkung ), "
strSQL = strSQL & "SELECT "
strSQL = strSQL & "ztbl_AngeboteImport.Bestellnummer, ztbl_AngeboteImport.VKOrg, ztbl_AngeboteImport.VKBür, ztbl_AngeboteImport.VKGr, ztbl_AngeboteImport.Auftrgeb, ztbl_AngeboteImport.Angelvon, ztbl_AngeboteImport.Belegdatum, ztbl_AngeboteImport.Vart, ztbl_AngeboteImport.Beleg, ztbl_AngeboteImport.Nettowert, ztbl_AngeboteImport.S, ztbl_AngeboteImport.Abgesagt, ztbl_AngeboteImport.erhalten, ztbl_AngeboteImport.offen, ztbl_AngeboteImport.Referiert, ztbl_AngeboteImport.Bemerkung, "
strSQL = strSQL & "FROM ztbl_AngeboteImport "
CurrentDb.QueryDefs("Abfrage1").SQL = strSQL

Das ganze ist im mdl_runImport_Neu Modul.

Atrus2711
05.06.2012, 09:13
Die Kommas vor dem SELECT und vor dem FROM magst du nochmal überdenken, aber so etwa, ja.

Du könntest den strSQL auch direkt ausführen, ohne ihn erst in einer Abfrage abzulegen. Aber so gehts auch.

magic1708
05.06.2012, 09:16
Cool,

doch nicht alles hoffnungslos bei mir :) :) :)

Die Kommas sind raus und aus dem Query Defs habe ich
CurrentDb.Execute = strSQL gemacht.

magic1708
05.06.2012, 10:08
So alte "ztbl_Import" löschen neue verlinken.
DAten in xtbl_Import löschen und Insert Into von ztbl in xtbl.....



Public Function runImportNEU(ByVal DateiPfad As String) As Boolean

On Error Resume Next
DoCmd.DeleteObject acTable, "ztbl_AngeboteImport" 'löscht die alte Import.xls aus den Tabellen

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel8 _
, "ztbl_AngeboteImport", DateiPfad, True 'Import.xls in FE verlinken

CurrentDb.Execute "DELETE FROM xtbl_Import" 'löschen der alten Datensätze in der Puffertabelle

Dim strSQL As String
strSQL = strSQL & "Insert Into "
strSQL = strSQL & "xtbl_Import ( Bestellnummer, VKOrg, VKBür, VKGr, Auftrgeb, Angelvon, Belegdatum, Vart, Beleg, Nettowert, S, Abgesagt, erhalten, offen, Referiert, Bemerkung ) "
strSQL = strSQL & "SELECT "
strSQL = strSQL & "ztbl_AngeboteImport.Bestellnummer, ztbl_AngeboteImport.VKOrg, ztbl_AngeboteImport.VKBür, ztbl_AngeboteImport.VKGr, ztbl_AngeboteImport.Auftrgeb, ztbl_AngeboteImport.Angelvon, ztbl_AngeboteImport.Belegdatum, ztbl_AngeboteImport.Vart, ztbl_AngeboteImport.Beleg, ztbl_AngeboteImport.Nettowert, ztbl_AngeboteImport.S, ztbl_AngeboteImport.Abgesagt, ztbl_AngeboteImport.erhalten, ztbl_AngeboteImport.offen, ztbl_AngeboteImport.Referiert, ztbl_AngeboteImport.Bemerkung "
strSQL = strSQL & "FROM ztbl_AngeboteImport "
'strSQL = strSQL & "WHERE (((ztbl_AngeboteImport.Beleg) Is Not Null)) OR (((ztbl_AngeboteImport.Angelvon) Is Not Null)) OR (((ztbl_AngeboteImport.VKBür) Is Not Null));"
CurrentDb.Execute strSQL


Ich denke nun kommt der komplizierte Teil....

magic1708
05.06.2012, 10:14
Hmm,

die leeren Datensätze holt er gar nicht erst in die xtbl... Das Where habe ich nicht mit eingetragen.

Atrus2711
05.06.2012, 10:33
Hat die Importtabelle irgendwelche Restriktionen:

Datentypen (sollte alles Text sein, da nur Text alles frisst)
Primärschlüssel (sollten keine drin sein)
Gültigkeitsregeln (dito)
Pflichtfelder (dito)


Und nebenbei: bei Excel ist immer zu bedenken, wie groß eigentlich der zu importierende Zellbereich ist. Wenn nur in den Zellen A1 und B34524 Werte stehen, müssten 34524 Zeilen übernommen werden, von denen 34522 leer sind.

Wo soll also aufgehört werden?

magic1708
05.06.2012, 10:35
Hat die Importtabelle irgendwelche Restriktionen
Meinst du in Access sprich die Puffertabelle?

Atrus2711
05.06.2012, 10:38
Ja, genau die.

magic1708
05.06.2012, 10:40
Ja hatte den PrimäriKey auf Beleg gehabt.. Das wars... Habe ihn auf ID gemacht und schon habe ich die lieben leeren DS wieder da.

Atrus2711
05.06.2012, 10:41
Bingo. :birthday:
Nun weiter.

magic1708
05.06.2012, 10:49
So nächste Idee wäre.....

Inkonstistenz Abfrage....

SELECT xtbl_Import.ID, xtbl_Import.Bestellnummer, xtbl_Import.VkOrg, xtbl_Import.VkBür, xtbl_Import.VKGr, xtbl_Import.Auftrgeb, xtbl_Import.Angelvon, xtbl_Import.Belegdatum, xtbl_Import.VArt, xtbl_Import.Beleg, xtbl_Import.S, xtbl_Import.Abgesagt, xtbl_Import.erhalten, xtbl_Import.offen, xtbl_Import.Referiert, xtbl_Import.Bemerkung, xtbl_Import.Auftragsnr, xtbl_Import.Nettowert
FROM xtbl_Import LEFT JOIN tbl_Angebote ON xtbl_Import.[Beleg] = tbl_Angebote.[Beleg]
WHERE (((tbl_Angebote.Beleg) Is Null));


Aber wie man dann weiter macht..... ?? Das ein Formular hoch kommt mit dem Inhalt etc....

Atrus2711
05.06.2012, 11:18
Das sind die zu importierenden, fehlenden Sätze ("Excel ohne Altdaten"). Idealerweise sind alle davon anzufügen. Aber da diese fehlenden Sätze fehlerhaft sein könnten (Felder nicht ausgefüllt, Felder widersprüchlich ausgefüllt etc), sollte diese Anfügung eben erst am Ende stehen.

Lass die Abfrage als Auswahlabfrage im Formular anzeigen. Bau eine bedingte Formatierung o.ä. Mimik ein, die die fehlerhaften Geschäfte anzeigt. Die sauberen Sätze kannst du dann über deine Anfüge-SQL übernehmen.

magic1708
05.06.2012, 11:28
Ich glaube ganz habe ich es noch nicht kappiert.

Ich erstelle eine Inkonsistenz Abfrage...
Als zweites eine Abfrage die alle Inhalte aus der Inkonsiszent auschliesst und importiere nur diese DAten...

Vorher lasse ich mir alle Daten auf einem Formular aus der Inkonsistenz Abfrage anzeigen... Oder Danach ist denke ich egal... Da diese eh nicht importiert werden.....

Jedoch sind ja hier noch einige Fehlerbehandlungen einzubauen?!

Atrus2711
05.06.2012, 11:42
Es kommt drauf an, wie dein Workflow sein soll.


Die Exceldatei liegt vor und wird in den Puffer importiert.
Im Puffer wird nun geprüft, ob Fehler vorliegen, die eine Weiterverarbeitung verhindern, z.B. Datentypfehler oder offensichtlich untaugliche Werte.
Wenn es keine Fehler gibt, kann alles weiterverarbeitet (angefügt) werden.
Wenn es aber Fehler gibt, was dann?

Fehler in einem Formular zeigen, damit sie dort "ad hoc" korrigiert werden können? Das hätt den Reiz, dass Schrott eben bereinigt wird und dann doch Gold wird. Nachteil: Excel kriegt davon nix mit!
Fehler in einem Formular oder Bericht zeigen und/oder ausdrucken, damit der Erfasser sie in Excel korrigiert. Der Import endet dann an dieser Stelle, da unplausbile Daten nicht weiterverarbeitet werden sollten.



Du bist dran.

magic1708
05.06.2012, 12:45
Wenn die Abfrage mir nen Wert zurückgeben würde wie null oder sowas könnte ich es so machen

Nur aus dem Kopf geschrieben


If qry_Inkonsistenz_Import = 0 then
Insert Into
tbl_Angebote(.....,.....,.....)
Select*
From xtbl_Import
MSGBOX IMPORT ERFOLGREICH.... X Datensätze wurden angefügt!
ELSE
DoCmd openForm frm_Import_Fehler
End if

Und das frm_Import_Fehler hängt an der InkonsistenzAbfrage. Folglich würde hier nur das drin stehen was nicht angefügt werden kann.

Man könnte jetzt noch den ELSE Code entsprechend anpassen und nur das einfügen was nicht in der Inkonsistenz Afrage ist.

Was meinst du?

Atrus2711
05.06.2012, 12:51
Dann bau halt eine Abfrage auf der Abfrage auf, die die fehlerhaften Sätze ermittelt, und lass die zählen. Wenn die Anzahl der fehlerhaften Sätze = 0 ist, dann Anfügen, sonst Formular öffnen.

magic1708
05.06.2012, 12:53
Ist es das was du meintest??

magic1708
05.06.2012, 14:19
So ich habe nun mal den kram soweit umgesetzt.

Formular erstellt... etc...

Jetzt wäre mal die Frage wie ich das in meinem Modul am geschicktesten starte bzw anwende.

Public Function runImportNEU(ByVal DateiPfad As String) As Boolean

On Error Resume Next
DoCmd.DeleteObject acTable, "ztbl_AngeboteImport" 'löscht die alte Import.xls aus den Tabellen

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel8 _
, "ztbl_AngeboteImport", DateiPfad, True 'Import.xls in FE verlinken

CurrentDb.Execute "DELETE FROM xtbl_Import" 'löschen der alten Datensätze in der Puffertabelle

Dim strSQL As String
strSQL = strSQL & "Insert Into "
strSQL = strSQL & "xtbl_Import ( Bestellnummer, VKOrg, VKBür, VKGr, Auftrgeb, Angelvon, Belegdatum, Vart, Beleg, Nettowert, S, Abgesagt, erhalten, offen, Referiert, Bemerkung ) "
strSQL = strSQL & "SELECT "
strSQL = strSQL & "ztbl_AngeboteImport.Bestellnummer, ztbl_AngeboteImport.VKOrg, ztbl_AngeboteImport.VKBür, ztbl_AngeboteImport.VKGr, ztbl_AngeboteImport.Auftrgeb, ztbl_AngeboteImport.Angelvon, ztbl_AngeboteImport.Belegdatum, ztbl_AngeboteImport.Vart, ztbl_AngeboteImport.Beleg, ztbl_AngeboteImport.Nettowert, ztbl_AngeboteImport.S, ztbl_AngeboteImport.Abgesagt, ztbl_AngeboteImport.erhalten, ztbl_AngeboteImport.offen, ztbl_AngeboteImport.Referiert, ztbl_AngeboteImport.Bemerkung "
strSQL = strSQL & "FROM ztbl_AngeboteImport "
CurrentDb.Execute strSQL

If (Select Count(*) From qry_Inko_Import ) = 0 then
Hier dann der Insert für die tbl Angebote
else
Ruft das Formualr auf und beendet diesen Import..


WIe kann ich am besten die Anzahl der DS raus bekommen??? Der Ansatz ob ist denke ich mal nicht der richtige??

magic1708
05.06.2012, 16:39
So das scheint auch erledigt zu sein.

If DCount("[ID]", "qry_Inko_Import") = 0 Then
MsgBox "WERT IST NULL", vbOKOnly + vbInformation, "Hinweis"

Else
DoCmd.OpenForm "frm_Import_Fehler"
'MsgBox "WERT LIEGT DRÜBER", vbOKOnly + vbInformation, "Hinweis"
End If


EInfach mal so zum Test... GIng aber...

Atrus2711
06.06.2012, 07:40
Ja, das ist ein Weg; wahrscheinlich sogar der einfachste, wenn auch nicht der schnellste. Aber es läuft. Das ist erstmal ein Erfolgserlebnis. :p

magic1708
06.06.2012, 08:18
Ich finde es toll.... Und das ganze ohne Code Hilfestellung! :-) :-)

Jetzt muss nur noch ein paar Sachen angepasst werden die mir diese Nacht eingefallen sind... Oder was er machen soll wenn das Formular hoch kommt... Mal sehen...
Wobei diese Sache die du mir nanntest mit prüfen auf Datentypfehler ist auch nicht gfanz so schlecht...

Atrus2711
06.06.2012, 09:05
Willkommen in DETL (http://de.wikipedia.org/wiki/ETL-Prozess)and :)
Wenn man wirklich alles abfangen will, wird es ziemlich hakelig. Es gibt sehr leistungsfähige und einfallsreiche Tippdeppen.

magic1708
06.06.2012, 12:45
Was ich gerne noch mal wissen möchte.

Die inkonsistenzAbfrage habe ich mit dem Assi geamcht.... vergleicht Beleg zu Beleg ist auch ok so.

Wir hatten heute Morgen im Produktiven System die Angebote von gestern Importiert.
In meiner Testumgebeung ( gleiche SQL Datenbank) wollte ich die Daten auch noch mal mit dem neuen Importverfahren importieren um zu testen ob es geht.
Also habe ich aus der Tabelle die Daten von gestern wieder gelöscht und anschließendn mit dem neuen System importiert. Es kam aber direkt ein der Fehler hoch das die Daten schon in der DB sind.
In der Abfrage waren diese Datensätze enthalten.
Warum den das?

Atrus2711
06.06.2012, 12:55
Ohne Kenntnis der Daten und der ausgeführten Abfrage kann ich dazu nichts sagen....

magic1708
06.06.2012, 13:02
SELECT xtbl_Import.ID, xtbl_Import.Bestellnummer, xtbl_Import.VkOrg, xtbl_Import.VkBür, xtbl_Import.VKGr, xtbl_Import.Auftrgeb, xtbl_Import.Angelvon, xtbl_Import.Belegdatum, xtbl_Import.VArt, xtbl_Import.Beleg, xtbl_Import.S, xtbl_Import.Abgesagt, xtbl_Import.erhalten, xtbl_Import.offen, xtbl_Import.Referiert, xtbl_Import.Bemerkung, xtbl_Import.Auftragsnr, xtbl_Import.Nettowert
FROM xtbl_Import LEFT JOIN tbl_Angebote ON xtbl_Import.[Beleg] = tbl_Angebote.[Beleg];


ztbl_AngeboteImport = Excel Datei
xtbl_Import = Puffer Tabelle im FE
tbl_Angebote = SQL Tabelle auf dem Server

Reicht dir das?

Atrus2711
06.06.2012, 13:26
Diese Abfrage liefert alle Importsätze, nicht lediglich die "noch nicht vorhandenen". Die SQL-tabelle wird zwar herangezogen, aber weder als Anzeigefeld noch als Filterkriterium benutzt. Sie ist also hier völlig unnütz eingesetzt.

Wenn du nur die noch nicht vorhandenen Sätze rüberschieben willst, wirst du ein Kriterium brauchen. Das Kriterium ist: WHERE tbl_Angebote.[Beleg] IS NULL

magic1708
06.06.2012, 14:03
Ich wollte an und für sich mit dieser Abfrage festellen welche DS schon vorhanden sind... und diese Anzeigen... Das Fehler Form habe ich auf diese Abfrage gebunden.

Was bringt mir den nun wenn ich filtere auf alles was keine Beleg nummer hat?!
Oder habe ich es nciht verstanden?

Atrus2711
06.06.2012, 14:08
*facepalm*
Du willst alle Sätze von Excel an den Server geben, die der noch nicht hat. Wenn du einfach alle Sätze von Excel rüberschiebst, kriegt der Server alles doppelt und dreifach.

Was bringt mir den nun wenn ich filtere auf alles was keine Beleg nummer hat?!
Das bringt dir die anzufügenden Sätze. "So viele aus Excel, wie noch nicht auf dem Server sind".

Beitrag #63 im Strang und kein Problembewusstsein. :entsetzt:

Und selbst hierfür:
welche DS schon vorhanden sind
ist die Abfrage nicht geeignet. Denn dafür müsstest du nur auf den Server gucken, nicht auf Excel.

magic1708
06.06.2012, 14:53
*autsch... :)

Einträge die aber doppelt in der DB sind findet er dann so aber nicht?!

Atrus2711
06.06.2012, 14:54
In welcher DB? Excel oder Server?

magic1708
06.06.2012, 14:58
Server.....


EDIT: Also doppelt kann ja nichts in die SQL DB aber der versuch soll halt angezeigt werden. Wenn inhalte in der Excel Datei bzw im Puffer sind die schon in der SQL DB vorhanden sind...

Atrus2711
06.06.2012, 15:04
Nein. Das war auch nicht Teil der Anforderung. "Neue anfügen" ist ungleich "vorhandene auf Eindeutigkeit prüfen".

Letztes könntest du aber natürlich erreichen:

im Nachhinein durch Abfragen, die die Duplikate ermitteln (hint hint)
im Vorhinein durch Techniken, die Duplikate erst gar nicht zulassen: eindeutige Indizes, Trigger, Anfügen durch Stored Procedures, die das zentral überprüfen, ...

Gerade auf einem Server sollte eine gewisse Ordnugn herrschen, sonst wird er schnell zu einer teuren Müllhalde...

magic1708
06.06.2012, 15:04
Schau mal ich habe den einen Post editiert!

Atrus2711
06.06.2012, 15:07
Doppelte Zeigen ginge über eine Abfrage, die die Schnittmenge liefert. Schema:
SELECT *
FROM Servertabelle INNER JOIN Exceltabelle
ON Servertabelle.Feld = Exceltabelle.Feld

Aber wenn du eh nur die anfügst, die eben noch nicht vorhanden sind, ist das doch wurscht. Im Extremfall könnte das Excelsheet sogar einfach nur ergänt werden, und die Importmechanik pult nur die neuen Sätze da raus und fügt sie an.

Wozu also eine Meldung, die aussagt: "die ersten 300.000 Sätze sind bereits da, aber die restlichen 45 wurden übernommen"?

magic1708
06.06.2012, 15:16
Wozu also eine Meldung, die aussagt: "die ersten 300.000 Sätze sind bereits da, aber die restlichen 45 wurden übernommen"?

Weil es Kollegen gibt die wissen möchten oder meiner Meinung nach wissen sollten was da falsch ist.... ?!

Klar wenn ich das jetzt so lasse bekomme ich wenigstens den kram weg mit den leeren Datensätzen... DAs ist schn mal gut...
Wir haben aber auch so Profis die gerne mal versuchen doppelt was zu importieren und dann mit der Schlüelverltzungsmeldung nichts anfangen können....

Atrus2711
06.06.2012, 15:23
Wir haben aber auch so Profis die gerne mal versuchen doppelt was zu importieren und dann mit der Schlüelverltzungsmeldung nichts anfangen können....
Die Schlüsselverletzung wird ein User sinnvollerweise nie zu sehen bekommen, weil nur die neuen Sätze importiert werden. Die verletzen den Schlüssel nicht. Ist das so schwer zu verstehen?

Weil es Kollegen gibt die wissen möchten oder meiner Meinung nach wissen sollten was da falsch ist.... ?!
Das hatten wir aber auch schon mal:

Doppelte Sätze zeigen: einen Beitrag vorher
Unvollständige Sätze zeigen: #32 (http://www.ms-office-forum.net/forum/showpost.php?p=1451260&postcount=32)

Wir loopen... Die Endlosschleife wird demnächst abbrechen.

magic1708
06.06.2012, 15:29
Jaa Martin.... Ich weiss das es doppelt ist...

Ich muss mir angewöhnen andere Sachen eindeutiger zuschreiben....

Mit der Schlüßelverletzung meinte ich die Meldungen mit dem alten Import verfahren...
Nicht das was wir im MOment beessen.

Ich werde mal was von weiter vorne probieren.... Direkt die Nullinger gar nicht erst in den Puffer holen... Dann schauen ob duplikate wenn nein rein damit wenn ja anzeigen in FRM... und hinweis auf überabreitung bzw prüfung....

Atrus2711
06.06.2012, 15:36
Direkt die Nullinger gar nicht erst in den Puffer holen...
Dann musst du, um die dann zu zeigen, auf das verlinkte Excelsheet statt den Importpuffer zugreifen. Du hast 2 Tabellen nicht im Griff, mit 3 wirds noch doller.

Hier ist die Übersicht. Mein letzter Akt in diesem Strang:

Excel importieren (alles)
Importtabelle (alleine) analysieren auf untaugliche Sätze (leere Felder, blöde Werte, erkennbarer Schrott). Diese Sätze dem User an den Kopf werfen zum Nacharbeiten,
Saubere neue Sätze per Inkonsistenzabfrage an den Server geben.
Saubere bereits vorhandene Sätze an den User geben mit den Worten "bereits vorhanden" und natürlich nicht auf den Server schieben.

I'm off.