on 02-26-2011 12:39 PM
Hallo Ihr Wissenden.
Habe in unserem B1 ca. 200 Arbeitsgänge angelegt, welche in diversen BOM's enthalten sind.
Es gibt ein User Defined Field in der OITM welches die Performance / h enthält. Aufgrund dieser
Performance wird der Preis für dieses Teil / Arbeitsgang berechnet und in Item Cost eingetragen.
Dieser Betrag steht nun in der OITM im Feld AvgPrice.
Um den Preis zu berechnen habe ich zum einen die Performance/Stunde und einen Durchschnitts-
Stundensatz der Production.
Wenn sich nun dieser Stundesatz ändert, muss bisher jeder Artikel von Hand geöffnet und der
neue Preis eingetragen Werden. Ändert sich die Performance aufgrund von Verbesserungen,
Automation etc. muss der Preis wieder geändert werden.
Dies möchte ich automatisieren.
Mein Gedanke ist folgender:
Lege einen neuen Artikel an, der als Item Cost den aktuellen Stundensatz enthält. Dieser Artikel dient
lediglich dazu diesen Stundensatz im System zu haben und wird sonst nicht verwendet.
Schreibe mir nun eine Routine in VBA, in der ich zum einen den Stundensatz auslese, dann
jeden Arbeitsgang mit diesen Satz neu berechne und das Feld AvgPrice in der OITM neu
schreibe.
Die Frage ist ganz einfach. Bisher habe ich nur Daten aus der Datenbank gelesen und nie
etwas geändert. Was passiert, wenn ich nun das Feld AvgPrice direkt in der OITM ändere?
Noch eine Info. Diese Artikel (Arbeitsgänge) sind NICHT als Lagerartikel deklariert. Das AvgPrice
Feld wird nicht von SAP berechnet, sondern der Preis von uns manuell eingetragen. In Jeder
BOM ist der Arbeitsgang mit Stückzahl 1/Fertigteil eingetragen. Also ein Arbeitsgang für jedes
Fertigteil. 1000 Fertigteile * Preis/Arbeitsgang = direkte Fertigungskosten. Meiner Meinung
nach dürfte es kein Problem sein, das Feld AvgPrice mit einem SQL Update Befehl zu ändern und
nicht über die SAP Maske selbst.
Wäre nett, wenn dies jemand bestätigen könnte, bevor ich die DB abschiesse
Hallo,
zur Information: Es ist nicht gestattet, direkt Daten in einer SAP - Datenbank zu verändern. Damit kannst Du wirklich in Schwierigkeiten geraten bis hin zum Verlust des Supports.
SAP stellt ein sogenanntes DI (Data - Interface) zur Verfügung, mit welchem man SAP Daten lesen UND schreiben kann (so, als täte es jemand vor dem Bildschirm, auch UI genannt).
Bitte schau Dir dazu einmal geeignete Dokumentationen an (oder frag noch mal nach).
Das sollte Dir helfen. Inhaltlich hast Du die Sache ja schon durchdacht, das habe ich nicht weiter untersucht / verstanden.
Gruß
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Erst mal vielen Dank für die Antwort.
Leider ist es nicht ganz das was ich mir erhofft habe.
Schon klar, das es nicht empfohlen wird direkt etwas in der DB zu ändern und dies
an der falschen Stelle SAP abschiesse kann.
Rede aber hier nicht von komplexen Eingriffen, sondern lediglich über ein Feld in der OITM Tabelle.
Gehe mal davon aus, das es Leute gibt, die das schon erfolgreich gemacht haben. Dieses
AvgPrice Feld in der OITM wird von SAP NICHT geändert, sondern in den Stammdaten, Reiter
Lager geben wir hier die Kosten für bestimmte Artikel ein. Bei anderen Artikeln, je nach Definition
ist dieses Feld gar nicht vorhanden.
Hallo Laowai,
wenn Du Dich in Dein Unglück stürzen möchtest, tue Dir keinen Zwang an. Ein kleiner Versuch noch meinerseits: Selbstverständlich wird das AvgPrice - Feld von SAP berechnet. Und selbstverständlich kann man eine SQL - Änderung dieses Feldes ganz leicht nachweisen (oder hast Du auch vor, z.B. entsprechende Protokolleinträge in der AITM -Tabelle und "weiß der Fuchs noch wo" anzulegen?
Letztendlich greifst Du da massiv in die SAP Logik ein, und davon ist einfach abzuraten.
Im übrigen ist das Feld AvgPrice von der gewählten Bestandsbewertungsmethode abhängig. Und je nachdem ist NICHT MAL MIT DEM DI das Feld änderbar. Es errechnet sich automatisch durch Belege, genauso wie z.B. ein Lagerbestand. Da kann ich auch gerne per SQL die Bestandsmenge ändern - helfen wird mir das auf lange Sicht aber nicht.....
Lass es sein, nur ein guter Rat.
Andreas
OK, ich glaube Dir ja und wenn ich nicht wüsste das es eine Gefahr gibt, hätte ich diesen Thread
nicht eröffnet.
Also, wie kann ich nun am einfachsten mit dieser DI und VBA das AvgPrice Feld beschreiben ?
Es geht hier nur um Artikel deren Bewertungsmethode Standart ist und bei denen wir die
Kosten in dieses Feld von Hand eintragen. Bei allen anderen Artikeln werde ich mich hüten
das Feld zu ändern, Da es in der Stammdatenmaske aufgrund der Artikeldefinitiion auch gar
nicht angezeigt wird.
Wie komme ich nun meinem Ziel näher ?
Versuch es mal hiermit (ungetestet, Beispiel ItemCode) in VBA:
Function ArtikelKorrekt()
Dim objCompany As SAPbobsCOM.Company
Dim objRec As SAPbobsCOM.Recordset
Dim objItems As SAPbobsCOM.Items
Dim strErr As String, lngErr As Long
Dim strItemCode As String
Dim lngRet As Long
Dim i As Long
If objCompany Is Nothing Then Set objCompany = GetSBOCompany()
Set objRec = objCompany.GetBusinessObject(BoRecordset)
Call objRec.DoQuery("SELECT ItemCode FROM WHERE 1=1")
objRec.MoveFirst
objRec.MoveLast
objRec.MoveFirst
i = objRec.RecordCount
Do While Not objRec.EOF
Set objItems = objCompany.GetBusinessObject(oItems)
strItemCode = objRec.Fields("Itemcode").Value
If objItems.GetByKey(strItemCode) = True Then
objItems.ItemName = "TEST"
objItems.Update
Call objCompany.GetLastError(lngErr, strErr)
If lngErr <> 0 Then
MsgBox (strErr & " (" & Trim(str(lngErr)))
End If
End If
objRec.MoveNext
Debug.Print "Artikel " & strItemCode & " Zeile " & i
i = i - 1
DoEvents
Loop
objCompany.Disconnect
End Function
Public objCompany As SAPbobsCOM.Company
Public lngErr As Long
Public strErr As String
Public blnKeineMeldungen As Boolean
Public Function GetSBOCompany() As SAPbobsCOM.Company
Dim vCompany As SAPbobsCOM.Company
'create company object
Set vCompany = New SAPbobsCOM.Company
'set paras for connection
vCompany.CompanyDB =
vCompany.Password =
vCompany.UserName =
vCompany.Server =
vCompany.LicenseServer =
vCompany.DbServerType =
vCompany.DbUserName =
vCompany.DbPassword =
'connect to database server
If (0 <> vCompany.Connect()) Then
Call vCompany.GetLastError(lngErr, strErr)
MsgBox "Fehler bei Connect: " & strErr
Set GetSBOCompany = Nothing
Else
Set GetSBOCompany = vCompany
MsgBox (vCompany.CompanyName & vbCrLf & "DB-Name " & vCompany.CompanyDB & vbCrLf & "Server " & vCompany.Server & " USER " & vCompany.UserName)
End If
End Function
Ist nur ein BEISPIEL, nicht Deine Lösung.
hdh
Andreas
Dankeschön....
Du Deklarierst dort Variablen als
Dim objCompany As SAPbobsCOM.Company
Dim objRec As SAPbobsCOM.Recordset
Dim objItems As SAPbobsCOM.Items
Woher kommen die Typen (SAPbobsCOM.Company etc). Muss ich nicht vorher etwas
installieren, diese Schnittstelle, oder ActiveXControl oder eine Treiber DLL damit es funktioniert?
Woher soll mein VBA diese Variablentypen sonst kennen ?
Diese Syntax ist falsch:
"If lngErr 0 Then"
Denke mal Du meinst "if lngErr = 0 Then"
weiterhin
"If (0 vCompany.Connect()) Then"
Ist vielleicht "if vCompany.Connect = 0 Then" gemeint ?
Gruss.
Laowai
Hallo,
wie schon gesagt, ein ungetesteter Code.. sollte nur eine kleine Starthilfe sein. Ich wusste nicht, das Du noch gar keinen Hintergrund hast (VBA / SDK von SAP und das DI). So wird das natürlich schwierig.
Als Hinweis vielleicht noch: Mein Code verändert den ItemCode, also Achtung.
Wichtig: Du musst das DI in dein Projekt einbinden, letztendlich registrierte DLL's von SAP. Da sie in Windows registriert sind, solltest Du die Verweise finden ("SAP Business One DI API Version 8.8"). Damit stehen Dir dann die DI - API Objekte in VBA oder .NET zur Verfügung. Und bitte schau Dir mal die Doku an.
hdh
Andreas
Nein, das DI - API wird mit dem Client installiert. Sollte also auf jedem SAP Rechner vorhanden sein.
Alternativ ist es auch als einzelnes Setup mit auf der SAP - CD. Ja, und letztendlich kannst Du es herunterladen (ist bestandteil der Installations-CD). Wie immer im Download-Center von SAP ([hier|https://websmp201.sap-ag.de/sbo-swcenter]).
Dann viel Erfolg!
Hab mir gestern das SDK installiert und mal kurz getestet. Leider keine Verbindung zum Server
bekommen.
Nur mal zur Sicherheit.
Unsere SAP Version ist SAP Business One 2007B (8.60.039) SP:00 PL:15
Dann gibt es jetzt unter VB Verweise folgende DI Versionen
SAP Business One DI API Version 2004
SAP Business One DI API Version 2005
SAP Business One DI API Version 2007
SAP Business One DI API Version 2007A
Welche von den DI Versionen muss ich aktivieren ?
In den Beispielen der SDK für VB6 steht
"check the "SAP Business One Objects Bridge Version 2007" check box
Hallo,
kerstin hat recht, nur eine Frage pro Thread, und Punkte vergeben (yes!). Aber ganz kurz: Spielt nicht wirklich eine Roll, Du musst in Dein VBA - Projekt die DI API - einbinden. Ich würde die 2007 nehmen, welche sonst?
Mein Beispielcode sollte dann eine Verbindung herstellen können, vorausgesetzt Benutzer / KW u.s.w. passen
hdh
Andreas
Möchte nur der Vollständigkeit halber meine jetzige Lösung des Problems schreiben.
Habe folgenden SQL Query String
update T0
set T0.AvgPrice = (Select AvgPrice from OITM where ItemCode = 'S0000001' )
/T0.U_item_per
FROM OITM T0
where T0.ItemCode like 'O___0%'
Wie schon oben beschrieben wäre es absolut tötlich für SAP, dies über VB / VBA etc direkt in der DB zu machen.
Da ich noch keine Zeit hatte mich ausgiebig mit dem SDK und der DI API zu beschäftigen, habe ich diesen Befehl
über das in SAP integrierte User Query Modul als User Query angelegt. Also wird das direkt über die SAP
Oberfläche gemacht .
Da dies nur 2 mal im Jahr ausgeführt werden muss, um den Kostenfaktor für alle Arbeitsgänge auf den aktuellen
Stundensatz (Gespeichert in S0000001) zu bringen, ist diese Lösung vertretbar.
Denke das ist OK oder ?
Edited by: Laowai on May 11, 2011 4:26 PM
User | Count |
---|---|
91 | |
7 | |
7 | |
4 | |
3 | |
3 | |
3 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.