jueves, 14 de julio de 2016

@@IDENTITY con MS Access y SQL Server

Problema

Supongamos un escenario en donde tenemos a SQL Server como base de datos y MS Access como aplicación.

Insertamos un registro en una tabla y queremos ver el ID asignado, para lo cual utilizamos esta línea de código:

Set rs = CurrentDb.OpenRecordset("SELECT @@IDENTITY", dbOpenForwardOnly)

¿Cuál es el problema?

Si existe un trigger detrás de esta tabla que inserta en otra tabla, es posible que el IDENTITY sea el del trigger y no el que estamos buscando

Solución

Una posible solución es usar la función nativa de SQL Server para obtener el último IDENTITY de una tabla:

Function Retornar_Identity_Tabla()
    Dim qdef As DAO.QueryDef
    Dim VarRecords As Variant
    Set qdef = CurrentDb.CreateQueryDef("")
    qdef.ReturnsRecords = True
    qdef.Connect = CurrentDb.TableDefs("dbo_Certificados").Connect
    qdef.sql = "SELECT IDENT_CURRENT('certificados')"
    qdef.OpenRecordset
    VarRecords = qdef.OpenRecordset.GetRows(1)
    Retornar_Scope_Identity = VarRecords(0, 0)
End Function

martes, 12 de julio de 2016

SQL SERVER: crear o reemplazar tabla

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'mitabla')
DROP TABLE mitabla
GO
CREATE TABLE [dbo].[mitabla](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Fecha] [datetime] NOT NULL,
[Aplicacion] [nvarchar](200) NOT NULL,
[Version] [nvarchar](50) NOT NULL,
[Titulo] [nvarchar](200) NOT NULL,
[Modulo] [nvarchar](200) NOT NULL,
[Usuario] [nvarchar](200) NULL,
[Detalle] [nvarchar](max) NULL,
[Severidad] [nvarchar](50) NULL,
CONSTRAINT [PK_mitabla] PRIMARY KEY
(
[ID]
)

martes, 28 de junio de 2016

MS Access error ODBC 4405

Quizá se hayan encontrado con este problema:



SQL Server tiene una limitación. Genera un error 4405 cuando se modifican campos en una vista que afectan a más de una tabla base.
Se puede resolver haciendo que cada vez que cambias un campo en esa pantalla, se grabe.

Private Sub Combo53_AfterUpdate()
    RunCommand acCmdSaveRecord
    Me.Requery
    Combo53.SetFocus
End Sub

Private Sub ComboInspector_AfterUpdate()
    RunCommand acCmdSaveRecord
    Me.Requery
    ComboInspector.SetFocus
End Sub


lunes, 27 de junio de 2016

MSAccess: A problem occured while DB was communicating with the OLE server or Active X Control

Me he encontrado con este problema en una base de datos existente:



Luego de probar muchas soluciones encontré una muy sencilla y efectiva:
  • Duplicar el formulario con problemas (copiar y pegar)
  • Borrar el formulario con problemas y reemplazarlo por el duplicado
Esta solución funcionó en mi caso. Más información en: http://stackoverflow.com/a/29355405/2144424

martes, 17 de mayo de 2016

SQL SERVER: crear usuario y login si no existen

IF NOT EXISTS 
    (SELECT name  
     FROM master.sys.server_principals
     WHERE name = 'ff')
BEGIN
    CREATE LOGIN ff WITH PASSWORD = N'ff', CHECK_POLICY = OFF
END
GO
IF NOT EXISTS 
    (SELECT 1   
     FROM DBO.SYSUSERS
     WHERE name = 'ff')
BEGIN
CREATE USER ff FROM LOGIN ff
EXEC SP_ADDROLEMEMBER 'db_datawriter', 'ff'
EXEC SP_ADDROLEMEMBER 'db_datareader', 'ff'
END
GO

lunes, 16 de mayo de 2016

SQL SERVER: crear o reemplazar stored procedure

IF object_id(N'[dbo].[EnviarMails_Auditoria]', 'p') IS NULL
    EXEC ('create procedure EnviarMails_Auditoria as select 1')
GO
ALTER PROCEDURE EnviarMails_Auditoria
AS
SELECT 2
GO

viernes, 13 de mayo de 2016

¿Cómo ejecutar un Stored Procedure de SQL Server desde MS Access?

Function Ejecutar_Procedimiento()
    Dim qdef As DAO.QueryDef
    Set qdef = CurrentDb.CreateQueryDef("")
    qdef.ReturnsRecords = False
    qdef.Connect = CurrentDb.TableDefs("[cualquier tabla linkeada de SQL]").Connect
    qdef.sql = "EXEC mi_store"
    qdef.Execute
End Function