2013-08-13 5 views
2

J'ai une procédure stockée SQL Server (dbo.WiegenMain) comme ci-dessous:Appel SQL procédure stockée à partir d'Access

ALTER PROCEDURE [dbo].[WiegenMain] 
AS 
BEGIN 

    insert into dbo.wiegen (Tag, Aufträge_anzahl, Wiegeraum) 
     select 
     dbo.datepart2(BUCHUNG_BIS) as Tag, 
     count(distinct AUFTRAGSNUMMER), Kurztext as Wiegeraum 
     from 
     dbo.tblZEITERFASSUNG 
     inner join 
     dbo.tblBELEGUNGSEINHEIT on tblZEITERFASSUNG.ID_BELEGUNGSEINHEIT = tblBELEGUNGSEINHEIT.ID 
     where 
     ID_BUCHUNGSART = 9 
     and ID_BELEGUNGSEINHEIT IN 
      (SELECT ID_BELEGUNGSEINHEIT 
       FROM dbo.tblPROZESS_BELEGUNGSEINHEIT 
       WHERE ID_PROZESS = 3) 
     and ABSCHLUSS = 1 
     AND dbo.DatePart2(BUCHUNG_BIS) = dbo.DatePart2(getdate()) 
    group by 
     dbo.DatePart2(BUCHUNG_BIS), Kurztext 
END 

Je veux appeler cette procédure stockée dans Microsoft Access en utilisant VBA, j'ai essayé ce qui suit:

premier essai:

Function InsertWiegen() 

Dim conn As ADODB.Connection 
Dim rcs As ADODB.Recordset 
Dim strSQL As String 
Dim strDel As String 

Set conn = CurrentProject.Connection 
strDel = "DELETE dbo.wiegen WHERE Tag = '" & Date & "'" 
strSQL = "INSERT INTO dbo.wiegen ([Tag], [Aufträge_anzahl], [Wiegeraum]) " & _ 
     "SELECT dbo.DatePart2([BUCHUNG_BIS]) as [Tag], count(distinct [AUFTRAGSNUMMER]) as [Aufträge_anzahl], Kurztext as [Wiegeraum] from dbo.tblZEITERFASSUNG inner join dbo.tblBELEGUNGSEINHEIT on tblZEITERFASSUNG.ID_BELEGUNGSEINHEIT=tblBELEGUNGSEINHEIT.ID where ID_BUCHUNGSART=9 and ID_BELEGUNGSEINHEIT in (SELECT ID_BELEGUNGSEINHEIT FROM dbo.tblPROZESS_BELEGUNGSEINHEIT WHERE ID_PROZESS = 3) and [ABSCHLUSS]=1 AND dbo.DatePart2([BUCHUNG_BIS])= dbo.DatePart2('" & Date & "') group by dbo.DatePart2([BUCHUNG_BIS]), [Kurztext]" 

Set rcs = conn.Execute(strDel) 

conn.Execute (strSQL) 

Set rcs = Nothing 

conn.Close 

Exit Function 

End Function 

Deuxième essai:

Function InsertWiegen() 

Dim conn As ADODB.Connection 
Dim rcs As ADODB.Recordset 
Dim cmd As ADODB.Command 
Dim strSQL As String 
Dim strDel As String 

Set conn = CurrentProject.Connection 
'Set cmd.ActiveConnection = CurrentProject.Connection 
Set cmd = New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandText = "WiegenMain" 
cmd.CommandType = adCmdStoredProc 

strDel = "DELETE dbo.wiegen WHERE Tag = '" & Date & "'" 

Set rcs = conn.Execute(strDel) 
cmd.Execute 

Set rcs = Nothing 
Set cmd = Nothing 

conn.Close 

Exit Function 

End Function 

dbo.datepart2() Fonction:

ALTER function [dbo].[DatePart2] (@date datetime) 
returns datetime 
as 
begin 

return(cast(CONVERT(varchar(12), @date, 101) AS datetime)) 
end 

Problème: Les deux méthodes donnent l'erreur -

« La conversion d'un type de données char à un type de données datetime a donné lieu à un hors -range datetime value. '

La procédure stockée fonctionne parfaitement dans SQL Server Management Studio, mais génère une erreur dans Microsoft Access. Le strDel fonctionne correctement, il supprime les enregistrements de la table de base de données avec succès, le problème est avec la requête strSQL. J'apprécierais vraiment, si quelqu'un peut savoir ce qui cause le problème ..

+0

Pas le problème ici, mais vous avez un double devis supplémentaire dans votre instruction SELECT lors de votre 1er essai, juste avant l'instruction GROUP BY. Je pense que la double citation juste avant les besoins de paren enlevé. – APrough

+0

Merci, j'ai supprimé ceux-ci, mais toujours le même problème .. –

+0

BUCHUNG_BIS est un type de données datetime? – APrough

Répondre

0

Résolution du problème d'une autre manière:

strSQL = "INSERT INTO dbo.wiegen ([Tag], [Aufträge_anzahl], [Wiegeraum]) 
SELECT left([BUCHUNG_BIS],11) as [Tag], count(distinct [AUFTRAGSNUMMER]) as [Aufträge_anzahl], Kurztext as [Wiegeraum] 
from dbo.tblZEITERFASSUNG 
inner join 
dbo.tblBELEGUNGSEINHEIT on tblZEITERFASSUNG.ID_BELEGUNGSEINHEIT=tblBELEGUNGSEINHEIT.ID 
where ID_BUCHUNGSART=9 and ID_BELEGUNGSEINHEIT 
in 
(SELECT ID_BELEGUNGSEINHEIT FROM dbo.tblPROZESS_BELEGUNGSEINHEIT WHERE ID_PROZESS = 3) 
and [ABSCHLUSS]=1 AND left([BUCHUNG_BIS],11)= left(GETDATE(), 11) 
group by left([BUCHUNG_BIS],11), [Kurztext]" 

Remplacé ma fonction datepart2 avec la fonction left(), maintenant il s'exécute avec succès sans aucune erreur.

0

Le texte que vous insérez dans votre instruction SQL pour la date dépendra de vos paramètres internationaux. Essayez de le convertir en 'YYYY-MM-DD' comme ceci: -

strDel = "DELETE dbo.wiegen WHERE Tag = '" & format (Date, "YYYY-MM-DD") & "'" 
+0

Mais strDel fonctionne bien, il supprime les enregistrements de la table avec succès, le problème est avec l'instruction strSQL .. Merci :) –

+0

Où est votre fonction datepart1? Vous utilisez cela dans la requête SQL, mais vous avez ci-dessus la fonction datepart2. – APrough

+0

datepart1 avait le type de retour varchar, reste était même, j'ai essayé avec datepart2 dans Access, toujours il a la même erreur –

0

Quel type de données est Tag dans SQL?

Si elle est numérique alors

STRDEL = "Supprimer dbo.wiegen WHERE Tag =" Format & (date, "DD")

+0

Tag est du type de données datetime dans SQL –

Questions connexes