Error de OLE DB con windows Vista/7 y no con XP

Tengo un sistema de administración de una empresa desarrollado en Visual Basic 6.0; usando una base de datos SQL SERVER 2000 y lo que me sucede es que cuando voy a procesar un comprobante de ventas me sale un error de OLE DB: "La operación de Múltiples pasos de OLE DB genero errores. Compruebe los valores de estado de OLD DB si es posible. No se realizo ningún trabajo". Pero cuando voy a procesar un comprobante de Remitos no me sale la leyenda y si lo procesa.
<h1>Lo raro es que con Windows XP no sucede nada de esto: puedo procesar ambos comprobantes sin ningun problema.</h1>
¿Me podes dar una mano con este problemita?

1 Respuesta

Respuesta
1
¿En qué sistema operativo te sucede el error?
En Windows 7 y Vista 32 bits. Igualmente tengo un equipo con XP (uno solo, los demás funcionan correctamente) que le sucede lo mismo. Me gustaría saber su solución, yo se que reinstalando windows se arregla, pero quisiera que esto funcione sin problemas para W7 y Vista.
Gracias
El problema es que vb6 utiliza dll y ocx las cuales se deben registrar en el registro del sistema, en Windows 7 y Vista por el etema de seguridad esto es un poco más complicado, debes instalar el programa con una cuenta de administrador.
Otra cosa, debes instalar con un instalador de Vb6, pues no es solo copiar los archivos y ya, en VB6 esto no funciona.
Si tengo un Setup que instala todas las DLL y OCX, pero lo raro es que en la parte de Facturación no funciona y en la de Remitos si. Ambos procesan comprobantes (es decir, llaman SP creados en SQL SERVER 2000 y registran en la BD)
En cuanto al primer punto, ya probé instalarlo 2 veces en la PC de XP que no me funciona y no hay caso. ¿Cuál podría ser otra alternativa?
¿En los SP que utilizas se utilizan transacciones? Es posible que están haciendo varias actualizaciones y no hay una trasaccion que valide que todo este bien se dejan los cambios y si hay un error en algún punto revierta las acciones que se hayan ejecutado antes del error.
Te dejo el SP de las ventas:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE Procedure [dbo].[vta_GrabaCabecera]
@Cliente int,
@Comprobante int,
@Prefijo int,
@NroComprobante int,
@Fecha datetime,
@Vendedor int,
@CondVta int,
@Deposito int,
@Sucursal int = NULL,
@Bruto money,
@Descuento decimal(5,4),
@ImpIva money,
@ImpTotal money,
@Estado char(3) = 'PEN',
@out1 int = NULL OUTPUT,
@Neto money,
@impoDescuento money,
@IVA decimal(5,4),
@ChequeaCredito bit,
@Observaciones varchar(300),
@Moneda varchar(10),
@Cambio money,
@Usuario int,
@CantBultos int = NULL,
@EnvioID int = NULL
AS
declare @Descripcion varchar(300)
declare @Empresa int
if (@Cambio = 0)
begin
set @Cambio = 1
end
if(@CantBultos = -1)
set @CantBultos = null
if(select imputaIVA FROM comprobantes where idComprobante = @Comprobante) = 0
begin
--Si no imputa iva el porcentaje de iva es 0%
set @IVA = 0
end
if @out1 is not null
begin
--Si ya existe la cabecera
if (select cabstatus from cabventas where idCabVenta = @out1) = 'PRO'
begin
--Ya esta procesado
RAISERROR('El comprobante ya esta procesado', 16, 1)
Return @out1
end
end
IF @out1 is NULL
BEGIN
--Chequeo que no este usado ese numero en ese talonario
if(SELECT COUNT(*)
FROM CABventas INNER JOIN
Comprobantes ON CABventas.idComprobante = Comprobantes.idComprobante INNER JOIN
Talonarios ON Comprobantes.idTalonario = Talonarios.idTalonario
WHERE (Talonarios.idTalonario = (SELECT com.idTalonario
FROM Comprobantes com INNER JOIN Talonarios
ON com.idTalonario=Talonarios.idTalonario
WHERE com.idComprobante=@Comprobante))
AND (CABventas.nroPrefijo = @Prefijo)
AND (CABventas.nroComprobante = @NroComprobante)) > 0
BEGIN
--Ya esta usado el numero
RAISERROR('Ese numero de comprobante ha sido utilizado', 16, 1)
Return @out1
END
INSERT INTO CABVentas(idClienteProveedor,idComprobante,nroPrefijo,nroComprobante,
fecComprobante,idVendedor,idCondVta,idDeposito,idSucursal,impBruto,impIVA,impTotal,
porDescuento,CabStatus,impDescuento, impNeto, porIVA, ChequeaCredito, Observaciones, Moneda, Cambio, usuario, cantBultos, EnvioID)
VALUES (@Cliente,@Comprobante,@Prefijo,@NroComprobante,@Fecha,@Vendedor,@CondVta,
@Deposito,@Sucursal,@Bruto,@ImpIva,@ImpTotal,@Descuento,@Estado,
@impoDescuento,@Neto,@IVA, @ChequeaCredito, @Observaciones, @Moneda, @Cambio, @Usuario, @CantBultos, @EnvioID)
SELECT @out1=MAX(idCabVenta) FROM CABVentas
UPDATE Talonarios
SET Talonarios.UltimoNroTalonario = Talonarios.UltimoNroTalonario + 1
WHERE Talonarios.idTalonario = (SELECT com.idTalonario
FROM Comprobantes com INNER JOIN Talonarios
ON com.idTalonario=Talonarios.idTalonario
WHERE com.idComprobante=@Comprobante)
set @Descripcion = 'Alta.'
END
ELSE
begin
UPDATE CABVentas
SET idClienteProveedor=@Cliente,
idComprobante=@Comprobante,
nroPrefijo=@Prefijo,
nroComprobante=@NroComprobante,
fecComprobante=@Fecha,
idVendedor=@Vendedor,
idCondVta=@CondVta,
idDeposito=@Deposito,
idSucursal=@Sucursal,
impBruto=@Bruto,
impIVA=@ImpIva,
impTotal=@ImpTotal,
porDescuento=@Descuento,
CabStatus=@Estado,
impDescuento =@impoDescuento,
impNeto = @Neto,
porIVA = @IVA,
ChequeaCredito = @ChequeaCredito,
Observaciones = @Observaciones ,
usuario = @Usuario,
Moneda = @Moneda,
Cambio = @Cambio,
fecha = getdate(),
cantBultos = @CantBultos,
EnvioID = @EnvioID
WHERE idCABVenta = @out1
set @Descripcion = 'Modificacion.'
end
SELECT @Empresa = idEmpresa FROM Comprobantes WHERE (idComprobante = @Comprobante)
set @Descripcion = @Descripcion + '
idVendedor=' + cast(@Vendedor as varchar) + '
idCondVta=' + cast(@CondVta as varchar) + '
idDeposito=' + cast(@Deposito as varchar) + '
idSucursal=' + cast(@Sucursal as varchar) + '
impBruto=' + cast(@Bruto as varchar) + '
impIVA=' + cast(@ImpIva as varchar) + '
impTotal=' + cast(@ImpTotal as varchar) + '
porDescuento=' + cast(@Descuento as varchar) + '
CabStatus=' + cast(@Estado as varchar) + '
impDescuento=' + cast(@impoDescuento as varchar) + '
impNeto=' + cast(@Neto as varchar) + '
porIVA=' + cast(@IVA as varchar) + '
ChequeaCredito = ' + cast(@ChequeaCredito as varchar)
INSERT INTO Comprobantes_Log
(Sector, idCabecera, idClienteProveedor, idComprobante, nroPrefijo, nroComprobante, fecComprobante, Descripcion, Empresa, Usuario)
VALUES ('Ventas',@out1,@Cliente,@Comprobante,@Prefijo,@NroComprobante,@Fecha,@Descripcion,@Empresa,@Usuario)
RETURN @out1
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Y acá abajo te dejo el SP de Remitos:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE Procedure [dbo].[rem_GrabaCabecera]
@Cliente int,
@Comprobante int,
@Prefijo int,
@NroComprobante int,
@Fecha datetime,
@Deposito tinyint,
@Sucursal tinyint = NULL,
@ImpoDeclarado money = NULL,
@Bultos int = NULL,
@Estado char(3) = 'PEN',
@out1 int = NULL OUTPUT,
@Usuario int,
@EnvioID int = NULL,
@Observaciones varchar(300)
AS
declare @Descripcion varchar(300)
declare @Empresa int
IF @out1 is NULL
BEGIN
INSERT INTO CABRemitos(idClienteProveedor,idComprobante,nroPrefijo,nroComprobante,
fecComprobante,idDeposito,idSucursal,impoDeclarado,cantBultos,CabStatus,EnvioID,Observaciones)
VALUES (@Cliente,@Comprobante,@Prefijo,@NroComprobante,@Fecha,
@Deposito,@Sucursal,@ImpoDeclarado,@Bultos,@Estado,@EnvioID,@Observaciones)
SELECT @out1 = MAX(idCABremito) FROM CABremitos
UPDATE Talonarios
SET Talonarios.UltimoNroTalonario = Talonarios.UltimoNroTalonario + 1
WHERE Talonarios.idTalonario = (SELECT com.idTalonario
FROM Comprobantes com INNER JOIN Talonarios
ON com.idTalonario=Talonarios.idTalonario
WHERE com.idComprobante=@Comprobante)
set @Descripcion = 'Alta.'
END
ELSE
begin
UPDATE CABremitos
SET idClienteProveedor=@Cliente,
idComprobante=@Comprobante,
nroPrefijo=@Prefijo,
nroComprobante=@NroComprobante,
fecComprobante=@Fecha,
idDeposito=@Deposito,
idSucursal=@Sucursal,
impoDeclarado=@ImpoDeclarado,
cantBultos=@Bultos,
CabStatus=@Estado,
EnvioID=@EnvioID,
Observaciones=@Observaciones
WHERE idCABremito = @out1
set @Descripcion = 'Modificacion.'
end
SELECT @Empresa = idEmpresa FROM Comprobantes WHERE (idComprobante = @Comprobante)
set @Descripcion = @Descripcion + '
idClienteProveedor=' + cast(@Cliente as varchar) + '
idComprobante=' + cast(@Comprobante as varchar) + '
nroPrefijo=' + cast(@Prefijo as varchar) + '
nroComprobante=' + cast(@NroComprobante as varchar) + '
fecComprobante=' + cast(@Fecha as varchar) + '
idDeposito=' + cast(@Deposito as varchar) + '
idSucursal=' + cast(@Sucursal as varchar) + '
impoDeclarado=' + cast(@ImpoDeclarado as varchar) + '
cantBultos=' + cast(@Bultos as varchar) + '
CabStatus=' + cast(@Estado as varchar)
INSERT INTO Comprobantes_Log
(Sector, idCabecera, idClienteProveedor, idComprobante, nroPrefijo, nroComprobante, fecComprobante, Descripcion, Empresa, Usuario)
VALUES ('Remitos',@out1,@Cliente,@Comprobante,@Prefijo,@NroComprobante,@Fecha,@Descripcion,@Empresa,@Usuario)
RETURN
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Lo raro es que en W XP siempre funciona, salvo en este caso particular y en W7/Vista nunca funciona.
Gracias
Efectivamente ninguno de los SP maneja transacciones, es una de als cosas que te aconsejo que hagas en los SP.
Que en XP te funcione y en Vista y en Win7 me parece que es cuestión de seguridad, pues estos dos sistemas operativos son más seguros que XP, verifica el tiempo de respuesta de la base de datos o sea el valor del timeout, que es posible que también pueda ser eso.
No creo que sea eso, ya lo cheque. Lo de transacciones es algo que quizás a futuro lo aplique, pero la verdad es que me interesa más saber porque es que no me funciona en este caso particular de XP (no quiero formatear como te dije, para aprovechar la oportunidad y llegar al fondo y descubrir porque es que sale este mensaje)
¿Tienes alguna otra idea?
En vb6 se necesita instalar el MDAC, ¿la version del XP es la misma de Vista y de Win7?
En WXP no me pide instalación del mismo. En W7 y Vista es la misma version según lo que vi en Google.
¿Instalaste el MDAC en el pc con win vista y con win 7? Si no lo instalaste tienes un porcentaje de error allí pues en win vista y en win 7 el manejo del acceso a los datos es diferente a como se hace en XP
En cuanto al error las posibles causas son:
Tienes un campo texto y le estas pasando más caracteres de los definidos en la tabla, estas grabando un texto en un campo numérico, estas grabando una fecha en un formato no válido para oledb.
Revisa estas porque estos son las causas más comunes de este error, recuerda Vista y 7 son sistemas operativos más exigentes en cuanto a la seguridad y este tipo de cosas en XP por eso si funcionan pues no valida esto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas