[SQL2Access] Code für Access aus SQL-Statement generieren: INSERT / Update

Intiii

Grünschnabel
Hi, vielleicht könnt ihr mir weiterhelfen...
Ich versuche den u.a. Code in Access umzusetzen, aber so leicht ist das wohl nicht, da das wohl alles verschachtelte Abfragen sein müssen.

Der zugrunde liegende Code greift auf die existenten Tabellen (Report,Item) zurück, die Ihr (vielleicht) von AIDA32/Everest kennt
und soll gewisse Informationen nach Tabelle t_Computer einfügen.

Der Code-Schnippel erledigt das:

Code:
	-- neue, noch nicht in t_Computer vorhandene dort einfügen:
		-- ggf. zwei identische Einträge in ITEMs für einen Report (z.B.ServicePack) = > 2 Datensätze => select distinct
	insert into t_Computer (strComputerName, Kommentar, strBetriebssystem,strServicePack,strInternetExplorer,strCPU,strArbeitsSpeicher, Hauptnutzer)
	select distinct rhost, Comment, BS.ivalue, SP.ivalue, IE.ivalue, CP.ivalue, RO.ivalue, MainUser
		from report R inner join item BS on r.id = BS.reportid 
			      inner join item SP on r.id = SP.reportid
			      inner join item IE on r.id = IE.reportid
			      inner join item CP on r.id = CP.reportid
			      inner join item RO on r.id = RO.reportid
			      left join t_computer C on R.rhost = c.strComputerName
		where BS.iid=513 and SP.iid=540 and IE.iid=564 and CP.iid=517 and RO.iid=520
			and c.strComputerName is null

Sodele, aber wie kreiere ich das ganze in Access? Dort habe ich vor mittels Visual Basic eine Funktion zu erstellen,
die das selbe erledigen soll. Eins zu eins umsetzen reicht nicht..

Mein erster Versuch, nur einen Rechner einzufügen klappt:

Code:
INSERT INTO t_Computer (strComputerName) 
SELECT R.RHost FROM Report R 
INNER JOIN Item I ON R.ID=I.ReportID
WHERE R.RHost Not In (Select strComputerName from t_Computer)
GROUP BY R.RHost;

Aber wie verschachtele ich nun die anderen Angaben da mit rein?

Schwierig, schwierig... *seufz*

Aus Verzweiflung habe ich 6 Abfragen gebastelt (BS,IE,SP,CP,RO,(NN))

Code:
SELECT Item.ReportID, Item.IValue AS <BS|SP|IE|CP|RO> FROM Item GROUP BY Item.ReportID, Item.IValue, Item.IID HAVING Item.IID=<513|540|564|517|520>;

BS,IE,SP,CP,RO sind alle identisch aufgebaut.

NN:

Code:
SELECT R.RHost, I.ReportID FROM Report AS R INNER JOIN Item AS I ON R.ID = I.ReportID
WHERE R.RHost Not In (Select strComputerName from t_Computer) GROUP BY R.RHost, I.ReportID;

Dann habe ich eine Einfüge-Abfrage gebastelt und den erhaltenen Code für die Funktion genommen:

Code:
Private Sub Befehl0_Click() 
CurrentDb().Execute " INSERT INTO t_Computer ( strComputerName, Kommentar, strBetriebssystem, strServicePack, strInternetExplorer, strCPU, strArbeitsSpeicher, Hauptnutzer ) " _
    & "SELECT Report.RHost AS strComputerName, Report.Comment AS Kommentar, BS.BS AS strBetriebssystem, SP.SP AS strServicePack, IE.IE AS strInternetExplorer, CP.CP AS strCPU, RO.RO AS strArbeitsSpeicher, Report.MainUser AS Hauptnutzer " _
    & "FROM NN INNER JOIN (((((Report INNER JOIN BS ON Report.ID=BS.ReportID) INNER JOIN CP ON Report.ID=CP.ReportID) INNER JOIN IE ON Report.ID=IE.ReportID) INNER JOIN RO ON Report.ID=RO.ReportID) INNER JOIN SP ON Report.ID=SP.ReportID) ON NN.ReportID=Report.ID "

MsgBox "Fertig"

Das funktioniert - sehr störend allerdings sind die Abfragen, die ich gerne direkt umgesetzt hätte.

Nachfolgend nach dem Einfügen soll zusätzlich ein Update laufen auf evtl. bereits vorhandene Rechner in t_Computer:

Der SQL-Code funktioniert - nur hier auch wieder: ACCESS ?

Code:
	-- update auf bekannte Rechner
	update t_computer
	set Kommentar = Comment, strBetriebssystem = BS.IValue, strServicePack = SP.IValue, strInternetExplorer = IE.IValue, strCPU = CP.IValue, strArbeitsSpeicher = RO.IValue, Hauptnutzer = MainUser
		from report R inner join item BS on r.id = BS.reportid 
			  inner join item SP on r.id = SP.reportid
			      inner join item IE on r.id = IE.reportid
			      inner join item CP on r.id = CP.reportid
			      inner join item RO on r.id = RO.reportid
			      inner join t_computer C on R.rhost = c.strComputerName
		where BS.iid=513 and SP.iid=540 and IE.iid=564 and CP.iid=517 and RO.iid=520

Eine Beispiel-DB ist in der Anlage enthalten.
 

Anhänge

  • db.zip
    17,1 KB · Aufrufe: 47
Zuletzt bearbeitet:
habs hingekriegt...

Code:
'   -- neue, noch nicht in Tabelle t_Computer vorhandene Rechner dort einfügen

    Dim stSql As String
    Dim stSqlu As String

    stSql = "INSERT INTO t_Computer (strComputerName, Kommentar, strBetriebssystem, strServicePack, strInternetExplorer, strCPU,strArbeitsSpeicher, Hauptnutzer) " _
        & " SELECT DISTINCT R.RHost, R.Comment, BS.IValue, SP.IValue, IE.IValue, CP.IValue, RO.IValue, R.MainUser" _
        & " FROM ((Item AS IE INNER JOIN (Item AS SP INNER JOIN (Report AS R INNER JOIN Item AS BS ON R.ID = BS.ReportID) ON SP.ReportID = R.ID) ON IE.ReportID = R.ID) INNER JOIN Item AS RO ON R.ID = RO.ReportID) INNER JOIN Item AS CP ON R.ID = CP.ReportID " _
        & " WHERE (((R.RHost) Not In (Select strComputername from t_Computer)) AND ((BS.IID)=513) AND ((SP.IID)=540) AND ((IE.IID)=564) AND ((CP.IID)=517) AND ((RO.IID)=520))"

    CurrentProject.Connection.Execute stSql


'   -- update auf bekannte Rechner

    stSqlu = "UPDATE ((((t_Computer INNER JOIN (Report AS R INNER JOIN Item AS CP ON R.ID = CP.ReportID) ON t_Computer.strComputerName = R.RHost) INNER JOIN Item AS IE ON R.ID = IE.ReportID) INNER JOIN Item AS SP ON R.ID = SP.ReportID) INNER JOIN Item AS BS ON R.ID = BS.ReportID) INNER JOIN Item AS RO ON R.ID = RO.ReportID SET t_Computer.Kommentar = [R].[Comment], t_Computer.strBetriebssystem = BS.Ivalue, t_Computer.strServicePack = SP.Ivalue, t_Computer.strInternetExplorer = IE.Ivalue, t_Computer.strCPU = CP.Ivalue, t_Computer.strArbeitsSpeicher = RO.Ivalue, t_Computer.Hauptnutzer = [R].[MainUser]" _
        & " WHERE (((BS.IID)=513) AND ((SP.IID)=540) AND ((IE.IID)=564) AND ((CP.IID)=517) AND ((RO.IID)=520))"

    CurrentProject.Connection.Execute stSqlu

Intiii
 
Zurück