cancel
Showing results for 
Search instead for 
Did you mean: 

SQL Datenbank direkt ändern

Former Member
0 Kudos

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

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

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ß

Former Member
0 Kudos

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.

Former Member
0 Kudos

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

Former Member
0 Kudos

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 ?

Former Member
0 Kudos

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

Former Member
0 Kudos

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

Former Member
0 Kudos

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

Former Member
0 Kudos

Deinen Code habe ich schon verstanden. Ist dem Standard Code für einen SQL Zugriff sehr

ähnlich und stellt kein Problem dar.

Nur woher bekomme ich nun diese SAP Business One DI API Version 8.8 ?

Gehört das zu einem SDK Paket, kann ich das wo downloaden ?

Former Member
0 Kudos

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!

Former Member
0 Kudos

Alles klar, habs auf der CD gefunden.

Werde mich da mal reindenken.

Jetzt erst mal 4 Wochen heim nach Deutschland und wenn ich zrück komme gehts weiter.

Vielen Dank fürs erste und Gruss aus Shanghai.

Laowai

Former Member
0 Kudos

Hallo,

bitte bitte. Du solltest die Frage als abgeschlossen markieren (und ev. Punkte für Antworten vergeben) - man kann nur eine bestimmte Anzahl offener Fragen im Forum haben.

Gruß

Former Member
0 Kudos

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

K_Pauquet
Advisor
Advisor
0 Kudos

Hallo Laowei,

bitte nur eine Frage pro Thread & Punkte vergeben.

Schoene Gruesse,

Kerstin

Former Member
0 Kudos

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

Former Member
0 Kudos

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

Answers (0)