[Gambas-user] Pre-release of Gambas 3.9.0 (episode II) - BUG!!
Christof Thalhofer
chrisml at ...3340...
Fri Aug 26 11:48:34 CEST 2016
Hi,
I installed Gambas Beta from Launchpad and tested it with my projects.
By opening one of them gambas3 destroys a module.
I attach them, the original is MLagerverwaltung.module, the destroyed
one is MLagerverwaltung.module.destroyed.
Shall I write a bug?
Alles Gute
Christof Thalhofer
--
Dies ist keine Signatur
-------------- next part --------------
' Gambas module file
Export
'' Nimmt eine neue Charge auf und liefert
'' den Primarykey der Charge
Public Function ChargeInLagerAufnehmen(PkRohproduktBestand As Long, sCharge As String, Lnr As Long, menge As Float) As Long
Dim qry, msg As String
Dim res As Result
Dim pkcharge As Long
'testen, ob das Rohprodukt bei diesem hersteller
'bereits eingerichtet ist
pkcharge = GetPkCharge(sCharge, Lnr, PkRohproduktBestand)
' If GefundeneAlteCharge <> Null And GefundeneAlteCharge <> Charge Then
If pkcharge > 0 Then
msg = "Diese Charge ist schon registriert, aber mit einer " &
"anders geschriebenen Chargennummer. Bitte diese verwenden." '& gb.lf & GefundeneAlteCharge
Message.Warning(msg)
Goto raus_ChargeInLagerAufnehmen
End If
qry = "SELECT fkproduktroh_bestand from tblieprod where Lnr = " &
Lnr & " and fkproduktroh_bestand = " & PkRohproduktBestand & ";"
res = DBs.Deg.Exec(qry)
If res.Count = 0 Then
msg = "Bei dem gewählten Hersteller ist das Rohprodukt nicht eingerichtet. " &
"Bitte erst in den Produkten des Herstellers anlegen."
Message.Warning(qry)
Goto raus_ChargeInLagerAufnehmen
End If
' ------------------------------------------------- Charge speichern
'nächste chargennummer
qry = "SELECT nextval('tbproduktcharge_pkproduktcharge_seq');"
res = DBs.Deg.Exec(qry)
pkcharge = res[0]
'neue charge erstellen
qry = "INSERT INTO tbproduktcharge (pkproduktcharge, " &
"bestand, Lnr, herstellercharge, fkproduktroh_bestand, " &
"herstellercharge_komp)VALUES " &
"(" & pkcharge & "," & menge & "," &
Lnr & ",'" & sCharge & "'," &
PkRohproduktBestand & ", '" & DegString.LowerCompact(sCharge) & "');"
DBs.Deg.Exec(qry)
raus_ChargeInLagerAufnehmen:
Return pkcharge
End
'' testet, ob die eingegebene Chargennummer schon einmal vorhanden ist
'' sorgt dafür mit einer Postgres-Regex für entfernung von space und sonderzeichen
'' liefert den primarykey der charge oder 0 wenn nicht gefunden
Public Function GetPkCharge(Charge As String, Lnr As Long, PkProduktrohBestand As Long) As Long
Dim origchargename As String
Dim qry As String
Dim res As Result
origchargename = DegString.LowerCompact(Charge)
qry = "select pkproduktcharge from tbproduktcharge " &
"where Lnr = " & Lnr & " and herstellercharge_komp = '" & origchargename &
"' and fkproduktroh_bestand = " & PkProduktrohBestand & ";"
res = Dbs.Deg.Exec(qry)
If res.Count > 0 Then
Return res!pkproduktcharge
Else
Return 0
End If
End
'' testet, ob ein gegebener Mengenname (Stück, l, 10erPack...) für ein
'' Rohprodukt in der Lagerverwaltung richtig ist
Function TesteMengennameFuerRohprodukt(fkproduktroh_bestand As Long, mengenname As String) As Boolean
Dim ergebnis As Boolean
Dim res As Result
Dim qry As String
Dim lagermengenname As String
Dim inttest As Integer
qry = "select mengenname from tbproduktroh_bestand where pkproduktroh_bestand = " & fkproduktroh_bestand & ";"
res = DBs.Deg.Exec(qry)
lagermengenname = res!mengenname
'Schauen, ob der übergebene Mengenname zum Lagermengennamen passt
qry = "select count (*) as anzahl from tbmengenfaktor where vergleichname = '" &
lagermengenname & "' AND mengenname = '" & mengenname & "';"
res = DBs.Deg.Exec(qry)
inttest = res!anzahl
If inttest > 0 Then
ergebnis = True
Else
ergebnis = False
End If
Return ergebnis
End
'' Übernimmt ein Rohprodukt eines Herstellers in das Lager.
'' Reduziert, falls vorhanden, Kontrakte.
''
'' Achtung diese Funktion übernimmt nur
'' Grundmengen, wie Stück, L, m, etc.
'' Faktoren, wie 6erPack etc müssen vorher umgerechnet worden sein
'' Liefert cancel = false bei erfolg
''
'' Charge kann Null oder "" sein
Public Function LagerAddiereLieferungProduktinLager(Lnr As Long, PkLiebestellDetail As Long, PkRohproduktBestand As Long, Menge As Float, Optional sCharge As String) As Boolean
Dim cancel As Boolean = True
Dim res As Result
Dim qry As String
Dim strmenge As String
Dim sql As New SqlWrapper(DBs.Deg)
Dim PkCharge As Long
strmenge = DegString.KommaZuPunkt(Menge)
'spiele die verschiedenen fälle durch
'1. es gibt keine Charge
'hier werden keine kontrakte upgedatet - kein kontrakt ohne charge!
If sCharge = Null Then
' ------------------------------------------------- Produkt ohne Charge
' ------------------------------------------------- Test ob Charge notwendig
qry = "SELECT tbproduktroh_bestand.chargenverwaltung from tbproduktroh_bestand " &
"where tbproduktroh_bestand.pkproduktroh_bestand = " & PkRohproduktBestand & ";"
res = Dbs.Deg.Exec(qry)
If res[0] = -1 Then
Message.Error("Ein Fehler ist aufgetreten. Dieses Produkt benötigt eine Chargennummer des Herstellers.")
cancel = True
Goto Ende
End If
' ------------------------------------------------- Produkt übernehmen
sql.Begin
'in tbliebestelldetail als ausgetragen markieren
qry = "UPDATE tbliebestelldetail SET inlageruebernommen = -1 WHERE pkbestelldetail = " &
PkLiebestellDetail & ";"
Dbs.Deg.exec(qry)
'in das lager übernehmen
qry = "UPDATE tbproduktroh_bestand SET bestand = bestand + " &
strmenge & " WHERE pkproduktroh_bestand = " & PkRohproduktBestand & ";"
Dbs.Deg.exec(qry)
sql.Commit
cancel = False
Goto Ende
Else
' ------------------------------------------------- Produkt mit Charge
'2.fall, es gibt eine chargennummer des herstellers
'schauen, ob diese chargennummer bereits vorhanden ist
'zuerst die eindeutigkeit der chargennummer klarstellen
PkCharge = GetPkCharge(sCharge, Lnr, PkRohproduktBestand)
If PkCharge > 0 Then
'charge wurde gefunden
'die menge im lager wird erhöht
sql.Begin
'produktabruf beim kontrakt festhalten, wenn kontrakt existiert
cancel = MKontrakt.EingangAusKontraktenAusbuchen(Lnr, PkRohproduktBestand, Menge, PkCharge)
If cancel = False Then
qry = "UPDATE tbproduktcharge SET bestand = bestand + " & strmenge &
" WHERE pkproduktcharge = " & PkCharge & ";"
Dbs.Deg.exec(qry)
'in tbliebestelldetail als ausgetragen markieren
'FIXME: Darf nur dann den eingang beenden, wenn die menge komplett übernommen wurde
qry = "UPDATE tbliebestelldetail SET inlageruebernommen = -1 WHERE pkbestelldetail = " & PkLiebestellDetail & ";"
Dbs.Deg.exec(qry)
sql.Commit
Else
sql.Rollback
End If
Goto Ende
Else
sCharge = DegString.LowerCompact(sCharge)
'diese charge des herstellers wurde nicht gefunden
'eine neue charge muß erstellt werden
sql.Begin
'in tbliebestelldetail als ausgetragen markieren
qry = "UPDATE tbliebestelldetail SET inlageruebernommen = -1 WHERE pkbestelldetail = " & PkLiebestellDetail & ";"
Dbs.Deg.exec(qry)
PkCharge = ChargeInLagerAufnehmen(PkRohproduktBestand, sCharge, Lnr, strmenge)
If PkCharge > 0 Then
'produktabruf beim kontrakt festhalten, wenn kontrakt für dieses produkt existiert
cancel = MKontrakt.EingangAusKontraktenAusbuchen(Lnr, PkLiebestellDetail, PkRohproduktBestand, Menge, PkCharge)
If cancel = False Then
sql.Commit
End If
Endif
If cancel = True Then
sql.Rollback
Endif
Goto Ende
End If
End If
Ende:
Return cancel
End
-------------- next part --------------
' Gambas module file
Export
'' Nimmt eine neue Charge auf und liefert
'' den Primarykey der Charge
Public Function ChargeInLagerAufnehmen(PkRohproduktBestand As Long, sCharge As String, Lnr As Long, menge As Float) As Long
Dim qry, msg As String
Dim res As Result
Dim pkcharge As Long
'testen, ob das Rohprodukt bei diesem hersteller
'bereits eingerichtet ist
pkcharge = GetPkCharge(sCharge, Lnr, PkRohproduktBestand)
' If GefundeneAlteCharge <> Null And GefundeneAlteCharge <> Charge Then
If pkcharge > 0 Then
msg = "Diese Charge ist schon registriert, aber mit einer " &
"anders geschriebenen Chargennummer. Bitte diese verwenden." '& gb.lf & GefundeneAlteCharge
Message.Warning(msg)
Goto raus_ChargeInLagerAufnehmen
End If
qry = "SELECT fkproduktroh_bestand from tblieprod where Lnr = " &
Lnr & " and fkproduktroh_bestand = " & PkRohproduktBestand & ";"
res = DBs.Deg.Exec(qry)
If res.Count = 0 Then
msg = "Bei dem gewählten Hersteller ist das Rohprodukt nicht eingerichtet. " &
"Bitte erst in den Produkten des Herstellers anlegen."
Message.Warning(qry)
Goto raus_ChargeInLagerAufnehmen
End If
' ------------------------------------------------- Charge speichern
'nächste chargennummer
qry = "SELECT nextval('tbproduktcharge_pkproduktcharge_seq');"
res = DBs.Deg.Exec(qry)
pkcharge = res[0]
'neue charge erstellen
qry = "INSERT INTO tbproduktcharge (pkproduktcharge, " &
"bestand, Lnr, herstellercharge, fkproduktroh_bestand, " &
"herstellercharge_komp)VALUES " &
"(" & pkcharge & "," & menge & "," &
Lnr & ",'" & sCharge & "'," &
PkRohproduktBestand & ", '" & DegString.LowerCompact(sCharge) & "');"
DBs.Deg.Exec(qry)
raus_ChargeInLagerAufnehmen:
Return pkcharge
End
'' testet, ob die eingegebene Chargennummer schon einmal vorhanden ist
'' sorgt dafür mit einer Postgres-Regex für entfernung von space und sonderzeichen
'' liefert den primarykey der charge oder 0 wenn nicht gefunden
Public Function GetPkCharge(Charge As String, Lnr As Long, PkProduktrohBestand As Long) As Long
Dim origchargename As String
Dim qry As String
Dim res As Result
origchargename = DegString.LowerCompact(Charge)
qry = "select pkproduktcharge from tbproduktcharge " &
"where Lnr = " & Lnr & " and herstellercharge_komp = '" & origchargename &
"' and fkproduktroh_bestand = " & PkProduktrohBestand & ";"
res = Dbs.Deg.Exec(qry)
If res.Count > 0 Then
Return res!pkproduktcharge
Else
Return 0
End If
End
'' testet, ob ein gegebener Mengenname (Stück, l, 10erPack...) für ein
'' Rohprodukt in der Lagerverwaltung richtig ist
Function TesteMengennameFuerRohprodukt(fkproduktroh_bestand As Long, mengenname As String) As Boolean
Dim ergebnis As Boolean
Dim res As Result
Dim qry As String
Dim lagermengenname As String
Dim inttest As Integer
qry = "select mengenname from tbproduktroh_bestand where pkproduktroh_bestand = " & fkproduktroh_bestand & ";"
res = DBs.Deg.Exec(qry)
lagermengenname = res!mengenname
'Schauen, ob der übergebene Mengenname zum Lagermengennamen passt
qry = "select count (*) as anzahl from tbmengenfaktor where vergleichname = '" &
lagermengenname & "' AND mengenname = '" & mengenname & "';"
res = DBs.Deg.Exec(qry)
inttest = res!anzahl
If inttest > 0 Then
ergebnis = True
Else
ergebnis = False
End If
Return ergebnis
End
'' Übernimmt ein Rohprodukt eines Herstellers in das Lager.
'' Reduziert, falls vorhanden, Kontrakte.
''
'' Achtung diese Funktion übernimmt nur
'' Grundmengen, wie Stück, L, m, etc.
'' Faktoren, wie 6erPack etc müssen vorher umgerechnet worden sein
'' Liefert cancel = false bei erfolg
''
'' Charge kann Null oder "" sein
Public Function LagerAddiereLieferungProduktinLager(Lnr As Long, PkLiebestellDetail As Long, PkRohproduktBestand As Long, Menge As Float, Optional sCharge As String) As Boolean
Dim cancel As Boolean = True
Dim res As Result
Dim qry As String
Dim strmenge As String
Dim sql As New SqlWrapper(DBs.Deg)
Dim PkCharge As Long
strmenge = DegString.KommaZuPunkt(Menge)
'spiele die verschiedenen fälle durch
'1. es gibt keine Charge
'hier werden keine kontrakte upgedatet - kein kontrakt ohne charge!
If sCharge = Null Then
' ------------------------------------------------- Produkt ohne Charge
' ------------------------------------------------- Test ob Charge notwendig
qry = "SELECT tbproduktroh_bestand.chargenverwaltung from tbproduktroh_bestand " &
"where tbproduktroh_bestand.pkproduktroh_bestand = " & PkRohproduktBestand & ";"
res = Dbs.Deg.Exec(qry)
If res[0] = -1 Then
Message.Error("Ein Fehler ist aufgetreten. Dieses Produkt benötigt eine Chargennummer des Herstellers.")
cancel = True
Goto Ende
End If
' ------------------------------------------------- Produkt übernehmen
sql.Begin
'in tbliebestelldetail als ausgetragen markieren
qry = "UPDATE tbliebestelldetail SET inlageruebernommen = -1 WHERE pkbestelldetail = " &
PkLiebestellDetail & ";"
Dbs.Deg.exec(qry)
'in das lager übernehmen
qry = "UPDATE tbproduktroh_bestand SET bestand = bestand + " &
strmenge & " WHERE pkproduktroh_bestand = " & PkRohproduktBestand & ";"
Dbs.Deg.exec(qry)
sql.Commit
cancel = False
Goto Ende
Else
' ------------------------------------------------- Produkt mit Charge
'2.fall, es gibt eine chargennummer des herstellers
'schauen, ob diese chargennummer bereits vorhanden ist
'zuerst die eindeutigkeit der chargennummer klarstellen
PkCharge = GetPkCharge(sCharge, Lnr, PkRohproduktBestand)
If PkCharge > 0 Then
'charge wurde gefunden
'die menge im lager wird erhöht
sql.Begin
'produktabruf beim kontrakt festhalten, wenn kontrakt existiert
cancel = MKontrakt.EingangAusKontraktenAusbuchen(Lnr, PkRohproduktBestand, Menge, PkCharge)
If cancel = False Then
qry = "UPDATE tbproduktcharge SET bestand = bestand + " & strmenge &
" WHERE pkproduktcharge = " & PkCharge & ";"
Dbs.Deg.exec(qry)
'in tbliebestelldetail als ausgetragen markieren
'FIXME: Darf nur dann den eingang beenden, wenn die menge komplett übernommen wurde
qry = "UPDATE tbliebestelldetail SET inlageruebernommen = -1 WHERE pkbestelldetail = " & PkLiebestellDetail & ";"
Dbs.Deg.exec(qry)
sql.Commit
Else
sql.Rollback
End If
Goto Ende
Else
sCharge = DegString.LowerCompact(sCharge)
'diese charge des herstellers wurde nicht gefunden
'eine neue charge muß erstellt werden
sql.Begin
'in tbliebestelldetail als ausgetragen markieren
qry = "UPDATE tbliebestelldetail SET inlageruebernommen = -1 WHERE pkbestelldetail = " & PkLiebestellDetail & ";"
Dbs.Deg.exec(qry)
PkCharge = ChargeInLagerAufnehmen(PkRohproduktBestand, sCharge, Lnr, strmenge)
If PkCharge > 0 Then
'produktabruf beim kontrakt festhalten, wenn kontrakt für dieses produkt existiert
cancel = MKontrakt.EingangAusKontraktenAusbuchen(Lnr, PkLiebestellDetail, PkRohproduktBestand, Menge, PkCharge)
If cancel = False Then
sql.Commit
End If
Endif
If cancel = True Then
sql.Rollback
Endif
Goto Ende
End If
End If
Ende:
Return cancel
End
More information about the User
mailing list