ADO STORED PROCEDURES
Posted: Mon Mar 11, 2013 5:27 pm
Buenas Tardes, alguien tendra un ejemplo de como llamar un store procedure y pasarles sus parametros MS-SQLSERVER a traves de ADO. Gracias.
www.FiveTechSoft.com
https://fivetechsoft.com/forums/
Code: Select all
cad_sql0:="SELECT pp_actualiza_stock(@co_art='"+xc_art+"',@co_alma='"+xc_alma+"',@total_art="+str(xtot_art)
cad_sql0:=cad_sql0+",@tipo_stock='stock_act',@costo_b="+str(xuct)+",@fecha_mov='"+dtoc(xf_lot)
cad_sql0:=cad_sql0+"',@stotal_art="+str(xst_art)+",@costo_om="+str(xuctom)+",@total_uni="+str(xtot_uni)
cad_sql0:=cad_sql0+",@co_us_in='PROFIT',@co_sucu='01',@r_stock_neg=2,@accion='R',@desde='NDD')"
oRs := CreateObject("ADODB.RecordSet")
ors:CursorType = adOpenDynamic
ors:CursorLocation = adUseClient
ors:LockType = adLockOptimistic
oRs:ActiveConnection:= bc:ado
oRs:source := cad_Sql0
oRs:Open()
Code: Select all
cQuery := "Select Neto( " + cNroLegajo + " ), Bruto( " + cNroLegajo + " )"
oRec := TOleAuto() : New ("ADODB.RecordSet")
oRec : CursorLocation := adUseClient
oRec : CursorType := adOpenDynamic
oRec : LockType := adLockOptimistic
oRec : ActiveConnection := oVarGlobales : oCon
oRec : Source := cQuery
oRec : Open()
Code: Select all
USE [demo]
GO
/****** Object: StoredProcedure [dbo].[pp_actualiza_stock] Script Date: 03/11/2013 15:08:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[pp_actualiza_stock]
/******************************************************************************
* Stored Procedure : pp_actualiza_stock *
* Fecha Creación : 22/11/2001 *
* Parámetros : - @co_art char(30) código del articulo al cual se le mo- *
* difica el stock. *
* - @co_alma char(6) código del almacen donde se afectará *
* el stock. *
* - @total_art decimal(28,12) cantidad de artículos. *
* - @tipo_stock char(9) tipo de operación a ser realizada: *
* - stock_com --> comprometido, *
* - stock_act --> actual, *
* - stock_des --> por despachar, *
* - stock_lle --> por llegar. *
* - @costo_b decimal(28,12) costo en la moneda base. *
* - @fecha_mov smalldatetime fecha del movimiento. *
* - @stotal_art decimal(28,12) cantidad de artículos en la *
* unidad secundaria. *
* - @costo_om decimal(28,12) costa en otra moneda. *
* - @total_uni decimal(28,12) unidad de la venta. *
* - @co_us_in char(6) usuario que realiza la operación. *
* - @co_sucu char(6) sucursal del movimiento. *
* - @r_stock_neg tinyint indica cual será el comportamien- *
* to con respecto al stock negativo: *
* - 0 --> indica que no se puede facturar en negativo. *
* - 1 --> indica que se debe preguntar al usuario si de- *
* sea facturar con estoc en negativo. *
* - 2 --> indica que puede facturar con stock en negati- *
* vo o que la respuesta fue positiva. *
* - @accion char(1) indica cual es el tipo de operación a *
* realizar sobre el stock: *
* - S --> aumentar el stock. *
* - R --> disminuir el stock. *
* - @desde char(4) indica desde donde se llama a este *
* procedimiento. *
* Descripción : Este procedimiento se encarga modificar el stock de un *
* artículo y de manejar el esquema de _ de negati- *
* vo de acuerdo a los parámetros que recibe. *
* Desarrollador : Noel Quiroz A. *
******************************************************************************/
@co_art char(30),@co_alma char(6),@total_art decimal(28,12),@tipo_stock char(9),
@costo_b decimal(28,12),@fecha_mov smalldatetime,@stotal_art decimal(28,12),
@nro_lote char(10),@fech_lote smalldatetime,@costo_om decimal(28,12),
@total_uni decimal(28,12),@co_us_in char(6),@co_sucu char(6),@r_stock_neg tinyint,
@p_lotefec_amb bit,@p_lotefec_res bit,@accion char(1),@desde char(4)
as
declare @cantidad_act decimal (28,12),@scantidad_act decimal (28,12),
@total_artc decimal(28,12) ,@status_sal int,@des_art varchar(120),
@ult_cos_un decimal(28,12) ,@cos_pro_un decimal(28,12),
@ult_cos_om decimal(28,12) ,@cos_pro_om decimal(28,12),
@fec_ult_co smalldatetime ,@fec_pro_un smalldatetime,
@fec_ult_om smalldatetime ,@fec_pro_om smalldatetime,
@relac_aut int ,@uni_relac decimal(28,12),
@p_lotenro bit ,@p_lotefec bit,
@lote bit
select @des_art = art_des ,@cantidad_act = stock_act,
@ult_cos_un = ult_cos_un,@cos_pro_un = cos_pro_un,
@ult_cos_om = ult_cos_om,@cos_pro_om = cos_pro_om,
@fec_ult_co = fec_ult_co,@fec_pro_un = fec_cos_pr,
@fec_ult_om = fec_ult_om,@fec_pro_om = fec_pro_om,
@relac_aut = relac_aut ,@uni_relac = uni_relac,
@lote = lote
from art where co_art = @co_Art
if @relac_aut in (2,3) and @uni_relac != 0
begin
set @stotal_art = 0
end
select @p_lotenro = p_lotenro, @p_lotefec = p_lotefec from par_emp
/******************************************************************************
* Proceso para el Stock comprometido. *
******************************************************************************/
if @tipo_stock = 'stock_com'
begin
if @accion = 'S'
begin
update art set stock_com = stock_com + (@total_art * @total_uni),
sstock_com = sstock_com + @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock comprometido ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_com = stock_com + (@total_art * @total_uni),
sstock_com = sstock_com + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
update st_almac set stock_com = stock_com - (@total_art * @total_uni),
sstock_com = sstock_com - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
update art set stock_com = stock_com - (@total_art * @total_uni),
sstock_com = sstock_com - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
/******************************************************************************
* Proceso para el Stock actual. *
******************************************************************************/
if @tipo_stock = 'stock_act'
begin
if @accion = 'S'
begin
/*Actualizar los costos*/
if @fecha_mov >= @fec_ult_co
begin
set @fec_ult_co = @fecha_mov
set @ult_cos_un = @costo_b
set @cos_pro_un = ((@ult_cos_un * @cantidad_act) + (@total_art * @costo_b))
/ (@cantidad_act + @total_art)
end
update art set stock_act = stock_act + (@total_art * @total_uni),
sstock_act = sstock_act + @stotal_art,
ult_cos_un = @ult_cos_un,
cos_pro_un = @cos_pro_un,
fec_ult_co = @fec_ult_co
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock actual en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock actual ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_act = stock_act + (@total_art * @total_uni),
sstock_act = sstock_act + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock actual en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
/******************************************************************************
* Manejo de lotes, para este fin se utilizan 3 variables: *
* - p_lotenro --> esta indica si en parámetros de la empresa está activada la *
* marca de trabajar los lotes por número. *
* - p_lotefec --> esta indica si en parámetros de la empresa está activada la *
* marca de trabajar los lotes por fecha de vencimiento. *
* - lote --> esta indica si el artículo en curso maneja lotes. *
******************************************************************************/
if (@p_lotenro = 1 or @p_lotefec = 1) and @lote = 1
begin
if len(rtrim(@nro_lote)) = space(0)
begin
select 3 as Errores,'El número de lote para el artículo ' + rtrim(@co_art) +
' no fue especificado '
return 3
end
if @fecha_mov > @fech_lote and @p_lotefec_res = 0
begin
if @p_lotefec_amb = 1
begin
select 3 as Errores,'El número de lote ' + rtrim(@nro_lote) + ' se encuentra vencido ' +
convert(varchar,@fech_lote,103)
return 3
end
else
if @p_lotefec_amb = 0
begin
select 2 as Errores,'El número de lote ' + rtrim(@nro_lote) + ' se encuentra vencido ' +
convert(varchar,@fech_lote,103) + '.' + char(13) + 'Desea Continuar?' as Mensaje
return 2
end
end
update st_lote set stock_act = stock_act - (@total_art * @total_uni),
@cantidad_act = stock_act - (@total_art * @total_uni),
sstock_act = sstock_act - @stotal_art,
@scantidad_act = sstock_act - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
and nro_lote = @nro_lote
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo actualizar el stock actual para el lote ' +
@nro_lote as Mensaje
RETURN 1
end
if @cantidad_act < 0
begin
if @r_stock_neg = 0
begin
if @desde in ('FACT','COMP')
select 3 as Errores,'No hay suficiente stock para el artículo ' + rtrim(@co_art) + ' almacén ' +
rtrim(@co_alma) + ' Nro lote ' + rtrim(@nro_lote) + '.' + char(13) +
'Stock actual: ' + convert(varchar,(@cantidad_act + (@total_art * @total_uni)))
as Mensaje
return 3
end
else
if @r_stock_neg = 2
begin
select 2 as Errores,'No hay suficiente stock para el artículo ' + rtrim(@co_art) + ' almacén ' +
rtrim(@co_alma) + ' Nro lote ' + rtrim(@nro_lote) + '.' + char(13) +
'Stock actual: ' + convert(varchar,(@cantidad_act + (@total_art * @total_uni))) + char(13) +
'Desea Continuar?' as Mensaje
return 2
end
end
end
if exists (select * from art where co_art = @co_art
and compuesto = 1
and @desde in ('FACT','COMP')
and stock_act < @total_art)
begin
select @total_artc = (@total_art - stock_act) from art where co_art = @co_art
exec @status_sal = pp_genera_compuesto @co_art,@co_alma,@total_artc,
@tipo_stock,@costo_b,@fecha_mov,
@stotal_art,@costo_om,@total_uni,
@co_us_in,@co_sucu,@r_stock_neg,
@accion
if @status_sal != 0
begin
return 0
end
end
if not exists(select * from st_almac where co_art = @co_art and co_alma = @co_alma)
Insert into st_almac (co_art, co_alma) values (@co_art, @co_alma)
update st_almac set stock_act = stock_act - (@total_art * @total_uni),
@cantidad_act = stock_act - (@total_art * @total_uni),
sstock_act = sstock_act - @stotal_art,
@scantidad_act = sstock_act - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo actualizar el stock actual para el almacen ' +
@co_alma as Mensaje
RETURN 1
end
if @cantidad_act < 0
begin
if @r_stock_neg = 0
begin
if @desde in ('FACT','COMP')
select 3 as Errores,'No hay suficiente stock, en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + char(13)
+ 'Stock actual: ' + convert(varchar,(@cantidad_act + (@total_art * @total_uni)))
as Mensaje
return 3
end
else
if @r_stock_neg = 2
begin
select 2 as Errores,'No hay suficiente stock, en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + ' Stock actual: ' +
convert(varchar,(@cantidad_act + (@total_art * @total_uni))) + '.' + char(13) +
'Desea Continuar?' as Mensaje
return 2
end
end
if @scantidad_act < 0 and @stotal_art != 0
begin
if @r_stock_neg = 0
begin
if @desde in ('FACT','COMP')
select 3 as Errores,'No hay suficiente stock(Secun), en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + char(13)
+ 'Stock actual: ' + convert(varchar,(@scantidad_act + (@stotal_art * @total_uni)))
as Mensaje
return 3
end
else
if @r_stock_neg = 2
begin
select 2 as Errores,'No hay suficiente stock(Secun), en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + ' Stock actual: ' +
convert(varchar,(@scantidad_act + (@stotal_art * @total_uni))) + '.' + char(13) +
'Desea Continuar?' as Mensaje
return 2
end
end
update art set stock_act = stock_act - (@total_art * @total_uni),
sstock_act = sstock_act - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock actual en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
/******************************************************************************
* Proceso para el Stock por despachar. *
******************************************************************************/
if @tipo_stock = 'stock_des'
begin
if @accion = 'S'
begin
update art set stock_des = stock_des + (@total_art * @total_uni),
sstock_des = sstock_des + @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock por despachar ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_des = stock_des + (@total_art * @total_uni),
sstock_des = sstock_des + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
update st_almac set stock_des = stock_des - (@total_art * @total_uni),
sstock_des = sstock_des - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
update art set stock_des = stock_des - (@total_art * @total_uni),
sstock_des = sstock_des - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
/******************************************************************************
* Proceso para el Stock por entregar. *
******************************************************************************/
if @tipo_stock = 'stock_lle'
begin
if @accion = 'S'
begin
update art set stock_lle = stock_lle + (@total_art * @total_uni),
sstock_lle = sstock_lle + @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock poe llegar ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_lle = stock_lle + (@total_art * @total_uni),
sstock_lle = sstock_lle + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
update st_almac set stock_lle = stock_lle - (@total_art * @total_uni),
sstock_lle = sstock_lle - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
update art set stock_lle = stock_lle - (@total_art * @total_uni),
sstock_lle = sstock_lle - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
RETURN
Code: Select all
// Trying to initiate the Stored Procedure
oCmd:=CreateObject("ADODB.Command")
oCmd:ActiveConnection:=oApp:oConnection
oCmd:CommandType:=adCmdStoredProc
oCmd:CommandText:="StockUpDate" // Strored Procedure Name
// Creating Parameters before sending parameters to Stored Procedure
oParam := oCmd:CreateParameter( "cPartNo", adChar, adParamInput, 25 )
oCmd:Parameters:Append( oParam )
oParam := oCmd:CreateParameter( "cPartName",adChar, adParamInput, 25 )
oCmd:Parameters:Append( oParam )
oParam := oCmd:CreateParameter( "cQty",adChar, adParamInput, 25 )
oCmd:Parameters:Append( oParam )
oParam := oCmd:CreateParameter( "cColumName",adChar, adParamInput, 25 )
oCmd:Parameters:Append( oParam )
// Assigning Values to the Paramter
TRY
oCmd:Parameters( "cPartNo" ):Value := SparMast->PART
oCmd:Parameters( "cPartName" ):Value := Rtrim(Ltrim(SparMast->DESC))
oCmd:Parameters( "cQty" ):Value := LTrim( Str(Int(SparMast->CURR_QTY)) )
oCmd:Parameters( "cColumName" ):Value := "Alpy_Parvr_Qty"
CATCH oError
ShowSqlError( oError )
END
// Executing or Calling Stored Procedure
TRY
oCmd:Execute()
CATCH oError
ShowSqlError( oError )
END
Code: Select all
oClientes := adoRecordSet( oApp:oAdoConnector, "EXEC sp_buscar_cliente '" + aVars[ 1 ] + "'" )
xBrowse( oClientes )
Function ADORecordSet( oConnect, cSql, lConnect )
Local oRs
Local cError := "No se ha podido crear el objeto contenedor RECORDSET !"
try
oRs := CreateObject("ADODB.RecordSet")
oRs:CursorLocation := 3
oRs:LockType := 4
oRs:ActiveConnection:= oConnect
oRs:source := cSql
oRs:Open()
lConnect := .t.
catch
msadoerror( cSql, "Error de Conexion con servidor" )
return nil
end try
Return oRS