VBA SQL kilka updatów SQL dotyczących tych samych zmiennych

VBA SQL kilka updatów SQL dotyczących tych samych zmiennych
Andrzej Lefik
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

mam taki problem, nie wiem jak w ubrać w jedną funkcję kilka updatów SQL w różnych tabelach, ale dotyczących tych samych zmiennych:
Mam taki kod:

Function KodyFaktur(NrFaktury As Variant, StaryKod As Variant, NowyKod As Variant)

Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
Dim rs As Object: Set rs = CreateObject("ADODB.Recordset")
strCon = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=001;Data Source=vsql01;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DESKTOP-JABC61G;Use Encryption for Data=False;Tag with column collation when possible=False"
cn.Open strCon
strSQL = "update gbkmut set btw_code = " & NowyKod & " where bkstnr = " & NrFaktury & " and btw_code = " & StaryKod

rs.Open strSQL, cn
End Function

Potrzebowałbym do tej samej funcji wkleić 2 kolejne updaty w pozostałych tabelach:
update amutas set btw_code = " & NowyKod & "where faktuurnr =" & NrFaktury & " And btw_code = " & StaryKod
update frhsrg set btw_code = " & NowyKod & "where faknr =" & NrFaktury & " And btw_code = " & StaryKod

będę wdzięczny za małą podpowiedź :)

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:dzień
  • Postów:2792
0

Zrób sobie stored proc w MS SQL - będzie na pewno bezpieczniej i w transakcji.
I nie Recordset, tylko Command, skoro nic nie pobierasz w wyniku...

PA
Sama SP nie zrobi tych 3 updateów w jednej transakcji, jak wywali mu np. 2 updatea to 1 nie zostanie wycofany, chyba, ze jawnie zadeklaruje transakcje w SP
Andrzej Lefik
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

ok. dzięki, spróbuję!

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
  • Postów:3882
0

Procedura jest rozwiazaniem, ale dostrzegam nieprawidłowość w kodzie, dlaczego otwierasz recordset, do zapytania update już bardzie pasuje ADODB.Command lub bez mozna tak:

Kopiuj
Function KodyFaktur(NrFaktury As Variant, StaryKod As Variant, NowyKod As Variant)

Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
dim ra as long
with cn
     .ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=001;Data Source=vsql01;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DESKTOP-JABC61G;Use Encryption for Data=False;Tag with column collation when possible=False"
     .Open
      strSQL = "update gbkmut set btw_code = " & NowyKod & " where bkstnr = " & NrFaktury & " and btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
      strSQL = "update amutas set btw_code = " & NowyKod & "where faktuurnr =" & NrFaktury & " And btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
      strSQL = "update frhsrg set btw_code = " & NowyKod & "where faknr =" & NrFaktury & " And btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
     .close
End With
End Function

Warto jeszcze to ubrać to w transakcje, aby mieć pewnośc że wszystkie updaty zadziałały....

edytowany 1x, ostatnio: Panczo
Andrzej Lefik
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

a mógłbyś podesłać przykład prostej transakcji?

Andrzej Lefik
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0
Panczo napisał(a):

Procedura jest rozwiazaniem, ale dostrzegam nieprawidłowość w kodzie, dlaczego otwierasz recordset, do zapytania update już bardzie pasuje ADODB.Command lub bez mozna tak:

Kopiuj
Function KodyFaktur(NrFaktury As Variant, StaryKod As Variant, NowyKod As Variant)

Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
dim ra as long
with cn
     .ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=001;Data Source=vsql01;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DESKTOP-JABC61G;Use Encryption for Data=False;Tag with column collation when possible=False"
     .Open
      strSQL = "update gbkmut set btw_code = " & NowyKod & " where bkstnr = " & NrFaktury & " and btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
      strSQL = "update amutas set btw_code = " & NowyKod & "where faktuurnr =" & NrFaktury & " And btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
      strSQL = "update frhsrg set btw_code = " & NowyKod & "where faknr =" & NrFaktury & " And btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
     .close
End With
End Function

Warto jeszcze to ubrać to w transakcje, aby mieć pewnośc że wszystkie updaty zadziałały....

działa super, dzięki, a mógłbyś podać jeszcze przykład kodu transakcji ?

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
  • Postów:3882
0

Dawno nie pisałem w ADO, ale z pamieci, coś w ten deseń:

Kopiuj
Function KodyFaktur(NrFaktury As Variant, StaryKod As Variant, NowyKod As Variant)

On Error Goto Error_Handler
Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
Dim transaction as boolean
dim ra as long

transaction = false
with cn
     .ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=001;Data Source=vsql01;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DESKTOP-JABC61G;Use Encryption for Data=False;Tag with column collation when possible=False"
     .Open
     .BeginTrans
     transaction = true
      strSQL = "update gbkmut set btw_code = " & NowyKod & " where bkstnr = " & NrFaktury & " and btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
      strSQL = "update amutas set btw_code = " & NowyKod & "where faktuurnr =" & NrFaktury & " And btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
      strSQL = "update frhsrg set btw_code = " & NowyKod & "where faknr =" & NrFaktury & " And btw_code = " & StaryKod
     .Execute strSQL, ra, adExecuteNoRecords
.    .CommitTran
     transaction = false
     .close
End With

exit function
Error_Handler:
If transaction Then
       cn.RollbackTrans  
end if
End Function
Andrzej Lefik
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

Dzieki wielkie!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.