VFP + SQL SERVER | Parametros

771 views
Skip to first unread message

Aldo Santos Vargas

unread,
Jan 18, 2012, 6:53:24 PM1/18/12
to publice...@googlegroups.com

Hola a todos,

Tengo una consulta -de repente sencilla- para que programan VFP+SQL Server.

Si tengo una tabla con 10 campos y tengo que insertar en el SQL-Server los 10 campos, necesariamente debo pasar por el SP (Store Procedure) parámetro por parámetro cada campo o existe una forma de colocarlos como un arreglo y dentro del SP desagregarlo uno por uno o como se hace en estos tipos de casos cuando los campos de una tabla son muchos o caballero nomas… enviar parámetro por parámetro…

 

Saludos

Aldo Santos



__________ Information from ESET NOD32 Antivirus, version of virus signature database 6807 (20120118) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com

Luis Mata

unread,
Jan 18, 2012, 8:08:35 PM1/18/12
to publice...@googlegroups.com
Asi:
 
 
ALTER proc [dbo].[sp_calle] @tipo int,@calle char(5),@dist varchar(2),@zon char(3),@urb char(4),@nom varchar(100),
@est bit, @nerror int output, @merror varchar(900) output,@anio char(4),@aran decimal(12,2),@ref varchar(150)=''
as
declare @ncod char(2), @auxn int
begin try
if @tipo=1---Update
begin
    update tab_calles set cod_dist=@dist,cod_urb=@urb,cod_zona=@zon,descrip = @nom, estado=@est,ref=@ref where cod_calle=@calle
    update tab_arancel set descrip=@nom, valor=@aran where anio=@anio and cod_dist=@dist and cod_calle=@calle
end
if @tipo=2—insert
begin
    set @auxn = (select MAX(cod_calle)+1 from tab_calles)
    insert into  tab_calles(cod_calle,cod_dist,cod_zona,cod_urb,descrip,ref,estado)
    values(dbo.nuevo_codigo5(@auxn),@dist,@zon,@urb,@nom,@ref,@est)
    insert into tab_arancel(anio,cod_dist,cod_calle,descrip,valor)
    values(@anio,@dist,dbo.nuevo_codigo5(@auxn),@nom,@aran)
end
if @tipo=3—delete
begin
    delete from  tab_calles where cod_calle=@calle
    delete from tab_arancel where anio=@anio and cod_dist=@dist and cod_calle=@calle
end
end try
begin catch
    set @nerror = error_number()
    set @merror = error_message()
end catch

Gorka

unread,
Jan 20, 2012, 8:25:14 AM1/20/12
to Comunidad de Visual Foxpro en Español
Mira esto:


declare @valores as varchar(1000)
select @valores=',a1,a2,a2334,2212,a1,a7'

declare @norden as integer
declare @valor as varchar(1000)

declare @campo1 as char(10)
declare @campo2 as char(10)
declare @campo3 as char(10)
declare @campo4 as integer
declare @campo5 as char(10)
declare @campo6 as char(10)

declare CURSOR_CAMPOS CURSOR FOR
SELECT ROW_NUMBER() OVER (ORDER BY id) AS Campos,
REPLACE( LEFT(SUBSTRING(parametro,id+1,LEN(parametro)),
case when patindex('%,%',(SUBSTRING(parametro,id+1,LEN(parametro)) ) )
=0 then 1000
else patindex('%,%',(SUBSTRING(parametro,id+1,LEN(parametro)) ) )
end ),',','') as valores
FROM ( select @valores as parametro) A INNER join nums ON
SUBSTRING(parametro,id,1) =','

open CURSOR_CAMPOS
fetch next from CURSOR_CAMPOS into @norden,@valor

WHILE @@FETCH_STATUS = 0
BEGIN

if @norden=1
select @campo1=@valor
if @norden=2
select @campo2=@valor
if @norden=3
select @campo3=@valor
if @norden=4
select @campo4=convert(integer,@valor)
if @norden=5
select @campo5=@valor
if @norden=6
select @campo6=@valor
fetch next from CURSOR_CAMPOS into @norden,@valor
end

close CURSOR_CAMPOS
DEALLOCATE CURSOR_CAMPOS
select @campo1,@campo2,@campo3,@campo4,@campo5,@campo6


Lo que yo defino como @valores seria un solo parametro que tu pasarias
al procedimiento
Aqui esta definido como variable para que lo pruebes.
Tu parametro empezaria siempre con una coma (,) o cualquier otro
caracter que usarias como separador de cada campo asi
',a1,a2,a2334,2212,a1,a7'

tienes que tener en tu base de datos de sql una tabla que se llame
nums con un solo campo llamdo id integer y clave primaria lleno con
numeros correlativos hasta el número que tu quieras pero siempre mayor
que el numero de campos de tus tablas.


Luego ya en el procedimiento definirás una variable por cada campo a
insertar y le asignas los valores en el orden que los hayas pasado en
el parametro.

yo creo que funcionará.
Saludos
Gorka

Samuel SM-H

unread,
Jan 20, 2012, 9:45:45 AM1/20/12
to publice...@googlegroups.com, aldo....@aop.com.pe
Hola Aldo,
la mejor forma que e podido implementar es usando XML.
Desde fox te creas un XML y lo envias al SQL, en SQL lo recibes en un campo y lo insertas a tu tabla; esto es mas usado para tablas detalles; para cabecera sólo enviales los campos correspondientes.

Victor Espina

unread,
Jan 20, 2012, 10:09:31 AM1/20/12
to publice...@googlegroups.com
Tomen en cuenta que los SP son, por definicion, LENTOS; y el procesamiento de cadenas en PL/SQL es AUN mas lento.

Este tipo de soluciones, generalmente, no son buenas.  Hasta donde yo conozco de SQL y SPs, solo hay dos vias para no estar tipeandolo a mano:

a) Usar las capacidades XML que brinda SQL Server, aunque la verdad, yo estoy "crudo" con esto.

b) Usar las capacidades de VFP para generar "wizards" que te generen el codigo automaticamente, tanto para el SP como para la rutina que lo invoca en SP.  Esto lo he utilizado en el pasado con muy buenos resultados. Simplemente te haces un programita en VFP que reciba el nombre de una tabla y te genere automaticamente los SPs para incluir un registro, modificar un registro, eliminar un registro, obtener un registro y obtener TODOS los registros.

Yo aplico este esquema:

a) Tengo un archivo llamado BASICSP.SQL que contiene todos los SPs generados automaticamente por esta rutina.

b) Tengo un archivo llamdo CUSTOMSP.SQL que contiene versiones modificadas de los SPs incluidos en BASICSP.SQL, cuando asi sea necesario, asi como SPs especificos que escribo manualmente.

Al momento de instalar, ejecuto primero BASICSP.SQL y luego CUSTOMSP.SQL, con lo que obtengo exactamente los SPs que necesito; mezcla entre SPs generados automaticamente y SPs creados desde cero o adaptados a partir de la version automatica.

Saludos

Victor Espina

mpulla

unread,
Jan 20, 2012, 11:28:50 AM1/20/12
to Comunidad de Visual Foxpro en Español
Hola Aldo.

Al igual que Samuel opino que XML es la mejor manera....

Saludos.

Aldo Santos Vargas

unread,
Jan 20, 2012, 12:36:21 PM1/20/12
to publice...@googlegroups.com, ssan_m...@hotmail.com

Hola Samuel,

Gracias por los comentarios…Estoy utilizando XML como medio de transferencia entre VFP + DLL + SQL-Server pero no me agrada la idea de pasar los 10 campos de la tabla como parámetros desde VFP aunque si es la única manera, caballero entonces..habrá que hacerlo.

 

Saludos

Aldo Santos



__________ Information from ESET NOD32 Antivirus, version of virus signature database 6812 (20120120) __________
Reply all
Reply to author
Forward
0 new messages