SQL Server Performance

URGENTE AYUDA

Discussion in 'Preguntas sobre SQL Server en Español.' started by romoos, Dec 20, 2005.

  1. romoos New Member

    hola, espero me puedan ayudar.

    tengo una tabla en donde una de las columnas la tengo como un texto en la cual guardo una formula a ejecutar en otras variables. Es decir algo como esto


    id_movcargo subtotaltotalformula
    1capital NULL50000NULL
    1interes NULL30000NULL
    1comision NULL30000capital*.002
    2capital NULL30000NULL
    2interes NULL30000NULL
    2comision NULL30000NULL
    3interes 212000capital*interes*plazo
    3cuota 2030000NULL
    3administracion 230000NULL

    La columna de formula la quiero pasar a otra tabla en donde voy a insertar los valores de subtotal y calcular los totales, mediante dicha formula, es decir quiero asignar el valor a una variable algo asi como @interes=formula, pero no encuentra la forma, la finalidad es que las formulas cambian continuamente y por eso mismo quiero dejar un procedimiento o un trigger que me permita hacer los calculos sin mover nada al codigo y si cambia la formula solo actualizarla en esta tabla y que los cambios se vean reflejados en los calculos.

    Espero me puedan ayuda y gracias
  2. Luis Martin Moderator

    Hola, dame un poco de tiempo para pensarlo.

    Saludos,

    Luis Martin
    Moderator
    SQL-Server-Performance.com

    One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important
    Bertrand Russell

    Nunca esperes el reconocimiento de tus hijos, eso ocurrirá luego de tu muerte


    All postings are provided “AS IS” with no warranties for accuracy.



  3. Luis Martin Moderator

    A mi criterio deberías hace un trigger for update y uno for insert.
    De esta forma podrías actualizar la otra tabla cuando se ingrese un nuevo registro o cuando se modifique.

    De todas formas, espera por otras opiniones.


    Luis Martin
    Moderator
    SQL-Server-Performance.com

    One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important
    Bertrand Russell

    Nunca esperes el reconocimiento de tus hijos, eso ocurrirá luego de tu muerte


    All postings are provided “AS IS” with no warranties for accuracy.



  4. c_maldon Member

    No se si entiendo bien la cuestión, pero te hce un ejemplo de susttucion para ver si resulta como base.

    Pegalo en el query analyzer y dame tus opiniones.

    Gracias

    y Felices Fiestas para todos
    /////////////////////////////

    create table #formula (Campo varchar(20), valor numeric(18,2),formula varchar(100))

    insert #formula (campo,valor,formula) values ('capital',10000,NULL)
    insert #formula (campo,valor,formula) values ('interes',Null,'capital * %interes * tiempo')
    insert #formula (campo,valor,formula) values ('%interes',.02,NULL)
    insert #formula (campo,valor,formula) values ('tiempo',30,NULL)

    print 'Antes de calcular'
    select * from #formula

    Declare @formula varchar(100)
    Declare @nValor numeric(18,2)

    Select @formula = formula from #formula where campo ='interes'

    select@formula = replace(@formula,f2.campo,str(f2.valor,10,2))
    from #formula f1,
    #formula f2
    wheref2.valor is not null

    exec ('Update#formula
    Setvalor = '+@formula +'
    from #formula
    where campo =''interes''')

    print 'despues de calcular'
    select * from #formula
  5. romoos New Member

    PARA C MALDON


    GRACIAS MALDON, EFECTIVAMENTE ES LO QUE BUSCO REALIZAR.

    SOLO QUE TENGO UNA DUDA MAS PARA PODER APLICARLO EN MI TRIGGER, ME PODRIA DETALLAR CON TUS PROPIAS PALABRAS QUE ES LO QUE HACES EN ESTA PARTE:

    select @formula = replace(@formula,f2.campo,str(f2.valor,10,2))
    from #formula f1,
    #formula f2
    where f2.valor is not null

    exec ('Update #formula
    Set valor = '+@formula +'
    from #formula
    where campo =''interes''')


    GRACIAS POR TU AYUDA.
    FELICES FIESTAS!!!!
  6. c_maldon Member

    Ok,

    El query:

    recorda que la formula es:'capital * %interes * tiempo'
    por lo tanto se necesita reemplazar cada una de las palabras por el valor respectivo
    el siguiente query prepara en la varriable @formula la ecuacion reemplazada.

    select @formula = replace(@formula,f2.campo,str(f2.valor,10,2))
    from #formula f1,
    #formula f2
    where f2.valor is not null

    luego hay que hacer que se ejecute la ecuacion, y como ella esta en una variable se arma un string que reemplazara el valor en la tabla definitiva.

    exec ('Update #formula
    Set valor = '+@formula +'
    from #formula
    where campo =''interes''')

    Saludos
  7. romoos New Member

    HOLA CMALDON:

    GRACIAS POR TU VALIOSA AYUDA, ME AYUDO BASTANTE Y YA LA ENTENDI POR COMPLETO

    DISCULPA NUEVAMENTE PERO TENGO OTRO PEQUEÑO PROBLEMA QUE NO PUEDO RESOLVER
    AHORA TENGO ESTA SITUACION:

    TENGO ESTA TABLA

    create table movimientos (id_mov int identity (1,1),
    importe float,
    plazo int,
    interes float,
    Procesos char(50)
    )

    insert into movimientos (importe, plazo, interes, procesos) values (15000, 20, .02, 123456)
    insert into movimientos (importe, plazo, interes, procesos) values (30000, 15, .015, 145)

    select * from movimientos


    LA COLUMNA DE PROCESOS ES UN CARACTER QUE QUIERO DESCOMPONER EN NUMEROS INDIVIDUALES ES DECIR EN LUGAR DE QUE SEA TODO EL VALOR: "123456" O "145" ME LO LEA COMO UN CAMPO 1 2 3 4 5 6 Y LOS PUEDA INSERTAR EN UNA NUEVA TABLA CON EL NUMERO DE ID_REGISTRO CORRESPONDIENTE, ESTO LO QUIERO HACER COMO UNA ESPECIE DE FACTURAS PORQUE EL ID_REGISTRO LO INSERTARIA EN UNA NUEVA TABLA CON CADA UNO DE LOS NUMERO (1 2 3 4 5 6 ) ASIGNARLE UN VALOR.

    ES DECIR ALGO COMO ESTO

    create table calculamovimientos (id_mov int,
    id_tipooperacion int,
    descripcionoperacion nchar(100),
    resultado float
    )

    insert into calculamovimientos (id_mov, id_tipooperacion) values (1, 1)
    insert into calculamovimientos (id_mov, id_tipooperacion) values (1, 2)
    insert into calculamovimientos (id_mov, id_tipooperacion) values (1, 3)
    insert into calculamovimientos (id_mov, id_tipooperacion) values (1, 4)
    insert into calculamovimientos (id_mov, id_tipooperacion) values (1, 5)
    insert into calculamovimientos (id_mov, id_tipooperacion) values (1, 6)

    insert into calculamovimientos (id_mov, id_tipooperacion) values (2, 1)
    insert into calculamovimientos (id_mov, id_tipooperacion) values (2, 4)
    insert into calculamovimientos (id_mov, id_tipooperacion) values (2, 5)


    Y LOS VALORES DE DESCRIPCION LOS LLENARE POSTERIORMENTE CON LA DESCRIPCION QUE CORRESPONDE POR EL NUMERO DE id_tipooperacion Y EL RESULTADO SERA ACTUALIZADO POR LA FORMULA QUE ARRASTRO Y QUE ME AYUDASTE A REALIZAR.

    EN RESUMEN ¿COMO PUEDO INSERTAR ESOS ID_REGISTRO Y LOS id_tipoOPERACION EN ESTA TABLA DE CALCULAMOVIMIENTOS A PARTIR DE LA DE MOVIMIENTOS? SEPARAR EL (123456) A REGISTROS 1 CON ID 1 , REGISTRO 2 CON ID 1, ETC.

    ESPERO ME PUEDAS AYUDAR GRACIAS.
  8. c_maldon Member

    Espero que te sea util.

    FELIZ AÑO para todos

    --------------------------------------
    Declare@nCaracter int
    Declare@cCaracter char(1)

    Declare@nId_movint
    Declare@nId_movMaxint

    Declare@procesosvarchar(50)

    Select@nId_mov= min(Id_mov),
    @nId_movMax= max(Id_mov)
    From movimientos

    while@nId_mov <= @nId_movMax
    Begin

    Select@procesos= procesos
    From movimientos
    WhereId_mov = @nId_mov

    Set@nCaracter = 1


    While@nCaracter <= len(@procesos)
    Begin

    Set@cCaracter = substring(@procesos,@nCaracter,1)

    If not exists (
    Select *
    From calculamovimientos
    WhereId_mov = @nId_mov
    Andid_tipooperacion= @cCaracter
    )
    Insertcalculamovimientos
    (id_mov, id_tipooperacion)
    values (@nId_mov , @cCaracter)

    Set@nCaracter = @nCaracter + 1
    End

    Set@nId_mov = @nId_mov + 1
    End

  9. Luis Martin Moderator

    Muchas Felicidades.


    Luis Martin
    Moderator
    SQL-Server-Performance.com

    Although nature commences with reason and ends in experience it is necessary for us to do the opposite, that is to commence with experience and from this to proceed to investigate the reason.
    Leonardo Da Vinci

    Nunca esperes el reconocimiento de tus hijos, eso ocurrirá luego de tu muerte


    All postings are provided “AS IS” with no warranties for accuracy.



Share This Page