Jag har användt DELETE FROM för att slippa få dubletter av samma Projektnummer i databasen, men nu funkar det inte utan det blir en dublett varje gång jag lägger till en ny rad i Flexgriden......, har även försökt att spara med UPDATE men det funkar inte heller, update raden såg ut så här: Hejsan Lägg upp en stored procedure i databasen som sköter kollen om den ska uppdateras eller läggas in - då slipper du koda det i vb. Mer problem.........
RS.Open "UPDATE TBL_ProjektLogg SET ProjektNummer =" & txtProjNr & ", Maskin = '" & Maskin & "',Matrial='" & Matrial & "',Arbete='" & Arbete & "',KostUtr=" & KostUtr & ",Offert='" & Offert & "',JobbJaNej='" & JobbJaNej & "',Other='" & Other & "',Kund='" & Kund & "',Namn='" & Namn & "',SummaTim=" & SummaTim & ",TimKost=" & TimKost & ",TotalSum=" & TotalSum & ", Dcon"
'-------------------------------------------------------------------------------
Nu ser koden ut så här:
Public Function SaveProjekt()
On Error GoTo ErrorTrap
Dim DBFileName As String
Dim Dcon As ADODB.Connection
Dim RS As ADODB.Recordset
Dim A As Integer
Dim txtProjNr As Long
DBFileName = GetIni("Databasinfo", "Path", App.Path & "\info.ini")
Set Dcon = New ADODB.Connection
Set RS = New ADODB.Recordset
Dcon.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;" & _
"Data Source=" & DBFileName
RS.Open "DELETE FROM TBL_Projektlogg WHERE ProjektNummer=" & CurrentProjekt & "", Dcon
Dim RowCounter As Integer
For RowCounter = 1 To frmProjekt.MSFlexGrid1.Rows - 1
Set RS = New ADODB.Recordset
Dim R As Integer
Dim C As Integer
Dim ProjektNummer As Long
Dim Personal As String
Dim Maskin As String
Dim Arbete As String
Dim Matrial As String
Dim KostUtr As Long
Dim Offert As String
Dim JobbJaNej As String
Dim Other As String
Dim Kund As String
Dim Namn As String
Dim SummaTim As Double
Dim TimKost As Long
Dim TotalSum As Double
R = R + 1
C = 0
'1
ProjektNummer = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
C = C + 1
'2
Personal = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
C = C + 1
'3
Arbete = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
C = C + 1
'4
Matrial = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
C = C + 1
'5
Maskin = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
C = C + 1
'6
If frmProjekt.MSFlexGrid1.TextMatrix(R, C) = "" Then
KostUtr = 0
Else
KostUtr = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
End If
C = C + 1
'7
Offert = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
C = C + 1
'8
JobbJaNej = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
C = C + 1
'9
Other = frmProjekt.MSFlexGrid1.TextMatrix(R, C)
'10
Kund = frmProjekt.lblKund.Caption
'11
Namn = frmProjekt.lblNamn.Caption
'12
If frmProjekt.txtSummaTimmar = "" Then
SummaTim = 0
Else
SummaTim = frmProjekt.txtSummaTimmar
End If
'13
If frmProjekt.txtHourCost = "" Or frmProjekt.txtHourCost = "0" Then
TimKost = 0
Else
TimKost = frmProjekt.txtHourCost
End If
'14
If frmProjekt.txtTotalSum.Text = "" Or frmProjekt.txtTotalSum.Text = "0" Then
TotalSum = 0
Else
TotalSum = frmProjekt.txtTotalSum.Text
End If
RS.Open "INSERT INTO TBL_ProjektLogg (ProjektNummer, Personal, Arbete, Matrial, Maskin, KostUtr, Offert, JobbJaNej, Other, Kund ,Namn, SummaTim, TimKost, TotalSum) " & vbCrLf & _
"VALUES (" & ProjektNummer & ", '" & Personal & "', '" & Arbete & "', '" & Matrial & "', '" & Maskin & "', " & KostUtr & ", '" & Offert & "', '" & JobbJaNej & "', '" & Other & "', '" & Kund & "', '" & Namn & "', " & SummaTim & ", " & TimKost & ", " & TotalSum & ")", Dcon
C = 1
Next
Dcon.Close
Screen.MousePointer = Default
Exit Function
ErrorTrap:
MsgBox Err.Description
Exit Function
End Functio
Sv: Mer problem.........
Har inte satt mig in i din kod just nu men jag tror att begreppen update och instert inte är riktigt "kristallklara" för dig :-)
När du använder INSERT skapas ALLTID en ny post i databasen. Om du då har en primärnyckel i databasen så får du inte lägga till en ny post som har SAMMA primärnyckel. Den får endast förekomma en gång.
INSERT SKA INTE HA NÅGON WHERE !! Posten finns ju inte !
Om du istället använder UPDATE. förutsätts det att posten redan finns och du ska ALTID ha med en WHERE.
Text "UPDATE tabellen set IDNR=12 WHERE IDNR=2"
Det du kan göra är att först kolla om posten finns i databasen för att veta om du ska använda UPDATE eller INSERT.
nåt liknande :
set rst=con.execute( "count(IDNR) from TABELLEN WHERE IDNR=" & dittVALUE)
if rst(0)>0 then ' Då finns posten redan
ANVÄND UPDATE
else
ANVÄND INSERT
end if
Det finns säker nåt fiffigare sätt att kolla om det finns nån post. Men principen är som ovan ( Andreas Hillvist kommer säkert med nåt "mer optimerat" alternativ :-)) )
NettanSv: Mer problem.........
tex som följer:
<code>
CREATE PROCEDURE spLtArtikel
(@artNr INTEGER = 0,
@artTyp varchar(1),
@artBen varchar(30) OUTPUT)
AS
DECLARE @ErrorSave INT
SET @ErrorSave = 0
UPDATE tblArtikel SET artBen=@artBen, artArtTyp=@artTyp WHERE artArtNr=@artNr;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO tblArtikel VALUES (@artNr, @artTyp, @artBen)
IF @@ERROR <> 0
SET @ErrorSave = @@ERROR
END
RETURN @ErrorSave
</code>
denna kod returnerar även eventuellt felmeddelande.
Det enda du behöver göra sedan är att skicka med dina inparametrar till sp:n...
ex:
<code>
//sSp är namnet på sp:n
//sSQL är inparametrarna konkatenerade som följer för en annan sp:
//sCall = iSNr + ", " + iKundNr + ", " + iArtNr + ", '" + datLevDat;
//sCall = sCall + "', " + iPl + ", " + iAnt + ", " + iTur + ", '" + sTkn2 + "'";
String sCall = "EXEC " + sSp + " " + sSQL;
this.stmt.execute(sCall);
</code>
//Emma