Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Lectura de Campos de 1 caracter (https://www.clubdelphi.com/foros/showthread.php?t=74282)

Chaja 09-06-2011 14:52:35

Lectura de Campos de 1 caracter
 
Estimado:
mi inquietud es la siguiente, estoy sacando el BDE de mi aplicacion, lo que me esta llevando bastante trabajo , son mas de 500 querys y mas de 100 store. Mi Te es que en lagunos SP tenia como resultado hacia la BD de Dato (Interbase) un Caracter el cual me tra S o N o una letra. Desde el lado del componete esa variable me vuelve vacia null , en al gunos casos me trae el valo, pero en otros no. Misma consulta mismo datos, pero distintos servidores. por ejemplo en el cliente , con los datos del cliente hago la consulta y me trae el valor de ESTADO en S o N, en tro cliente otra base no lo hace , hago por el IB Expert si la consulta esta bien y lo esta , ya que el sp siempre me devuelve un registro con datos. Siempre que hay una devolucion de un caracter no me lee nada, el campo en el stro lo define como CHAR (1) y luego con VARCHAR, pero no hubo cambios. Los comp, que uso ahora son los DBX. Alguna idea???
Gracias

Casimiro Notevi 09-06-2011 15:14:39

Disculpa, pero no sé si tu teclado tiene algún problema y faltan bastantes letras por lo que dificulta muchísimo poder entender exactamente lo que estás diciendo. ¿Puedes reescribir la pregunta procurando que no falten letras?, gracias amigo :)

Chaja 09-06-2011 15:37:04

Estimado:
mi inquietud es la siguiente, estoy sacando el BDE de mi aplicacion, lo que me esta llevando bastante trabajo , son mas de 500 querys y mas de 100 store. Mi Tema es: que en algunos SP tenia como resultado (BD de Dato Interbase) un Caracter el cual me trae S o N o una letra.
Desde el lado del componete esa variable me vuelve vacia null , en al gunos casos me trae el valor, pero en otros no.
Misma consulta mismo datos, pero distintos servidores. por ejemplo en el cliente , con los datos del cliente hago la consulta y me trae el valor de ESTADO en S o N, en otro cliente otra base no lo hace. Lo hago por el IBExpert si la consulta esta bien y lo esta , ya que el sp siempre me devuelve un registro con datos. Siempre que hay una devolucion de un caracter y no me lee nada, el campo en el sp lo define como CHAR (1) y luego con VARCHAR, pero no hubo cambios. Los comp, que uso ahora son los DBX. Alguna idea???
anexo el Sp

Código SQL [-]CREATE PROCEDURE TOTAL_PAGOS_MENSUAL_PROVEEDORES ( CODIGO VARCHAR(6), FECHA DATE) RETURNS ( TOTAL NUMERIC(15,3), EXENTO VARCHAR(1), CODIGO_REGIMEN INTEGER, PAGOS_ANTERIORES NUMERIC(15,3), CONCEPTO CHAR(25), MINIMO_NO_IMPONIBLE NUMERIC(15,3), TASA NUMERIC(15,3), IMPUESTO_MINIMO NUMERIC(15,3), EXENTO_ID INTEGER) AS DECLARE VARIABLE PAGOS_ANTERIORES_AUX NUMERIC(15,3); DECLARE VARIABLE ANULACIONES NUMERIC(15,3); begin /* Busco el proveedor si es exento a las ganacias y el codigo de retencion*/ select p.exento_ganacia,p.codigo_regimen_ret_ganacia from poveedor p where p.codigo=:codigo into :exento,:codigo_regimen; if (exento='N') then begin select Sum(op.total_neto_gravado) from ordenpago op where extract( month from op.fecha)= extract (month from :fecha) and extract (year from op.fecha)=extract (year from :fecha) and op.codigo=:codigo into :total; if (total is null) then total=0; select t.alicuota,t.minimo_no_imponible,t.concepto,t.impuesto_minimo from tasas_ret_ganancia t where t.codigo=:codigo_regimen into :tasa,:minimo_no_imponible,:concepto,:impuesto_minimo; /*Sumo los pagos de las retenciones aneriores */ select Sum(ret.impuesto_retenido) from retenciones_ganancia ret where extract(month from ret.fecha)=extract (month from :fecha) and extract (year from ret.fecha)=extract (year from :fecha) and ret.codigo_proveedor=:codigo into :pagos_anteriores; if (pagos_anteriores is null) then pagos_anteriores=0; /*************************/ /*Sumo las Anulaciones */ anulaciones=0; pagos_anteriores_aux=0; select Sum(a_ret.impuesto_retenido) from anulacion_retenciones_ganancia a_ret where extract(month from a_ret.fecha)=extract (month from :fecha) and extract (year from a_ret.fecha)=extract (year from :fecha) and a_ret.codigo_proveedor=:codigo into :anulaciones; if (anulaciones is null) then anulaciones=0; /***************************/ pagos_anteriores_aux=:pagos_anteriores-:anulaciones; pagos_anteriores=:pagos_anteriores_aux; end else begin tasa =0; concepto =''; minimo_no_imponible=0; exento ='S'; pagos_anteriores =0; impuesto_minimo =0; end if (exento = 'N') Then begin exento_id=0; end else begin exento_id = 1; end /* Procedure Text */ /*suspend;*/ end


y como lo llamo desde la aplicacion
Código Delphi [-] if DMMain_2.AgenteRetencionGanacia='S' Then begin QTraer_Pagos_Proveedor.Close; QTraer_Pagos_Proveedor.ParamByName('CODIGO').AsString := Dato; QTraer_Pagos_Proveedor.ParamByName('Fecha').AsDate := CDSOPagoFECHA.AsDateTime; QTraer_Pagos_Proveedor.Open;//ExecProc; if (QTraer_Pagos_ProveedorEXENTO.AsVariant='N') or (QTraer_Pagos_ProveedorEXENTO.AsString='N') or (QTraer_Pagos_ProveedorEXENTO.AsWideString='N') or (QTraer_Pagos_ProveedorEXENTO_ID.Value=0) Then CDSOPagoRETIENE_GANACIAS.Value:='S' else CDSOPagoRETIENE_GANACIAS.Value:='N'; if CDSOPagoTIPOIVA.Value<>1 Then CDSOPagoRETIENE_GANACIAS.Value:='N'; if CDSOPagoRETIENE_GANACIAS.Value='S' Then begin // este es el Total de netos gravados del mes CDSOPagoTOTAL_PAGOS_DEL_MES.AsFloat := QTraer_Pagos_ProveedorTOTAL.AsFloat; // total de impuestos pagados CDSOPagoTOTAL_RETENIDO_MES.AsFloat := QTraer_Pagos_ProveedorPAGOS_ANTERIORES.AsFloat; CDSOPagoTASA_RETENCION_GANACIA.AsFloat := QTraer_Pagos_ProveedorTASA.AsFloat; CDSOPagoMINIMO_NO_IMPONIBLE_GANANCIA.AsFloat := QTraer_Pagos_ProveedorMINIMO_NO_IMPONIBLE.AsFloat; CDSOPagoCODIGO_REGIMENA_GANANCIA.Value := QTraer_Pagos_ProveedorCODIGO_REGIMEN.AsInteger; CDSOPagoCONCEPTO_RETENCION_GANACIA.Value := QTraer_Pagos_ProveedorCONCEPTO.AsString; CDSOPagoIMPUESTO_MINIMO_GANANCIA.AsFloat := QTraer_Pagos_ProveedorIMPUESTO_MINIMO.AsFloat; end; QTraer_Pagos_Proveedor.Close; end;


Gracias y perdon por la falta de ortografia, me pasa por apurado

Chaja 09-06-2011 15:40:00

Código SQL [-]
CREATE PROCEDURE TOTAL_PAGOS_MENSUAL_PROVEEDORES (
    CODIGO VARCHAR(6),
    FECHA DATE)
RETURNS (
    TOTAL NUMERIC(15,3),
    EXENTO VARCHAR(1),
    CODIGO_REGIMEN INTEGER,
    PAGOS_ANTERIORES NUMERIC(15,3),
    CONCEPTO CHAR(25),
    MINIMO_NO_IMPONIBLE NUMERIC(15,3),
    TASA NUMERIC(15,3),
    IMPUESTO_MINIMO NUMERIC(15,3),
    EXENTO_ID INTEGER)
AS
DECLARE VARIABLE PAGOS_ANTERIORES_AUX NUMERIC(15,3);
DECLARE VARIABLE ANULACIONES NUMERIC(15,3);
begin
  /* Busco el proveedor si es exento a las ganacias y el codigo de retencion*/
  select p.exento_ganacia,p.codigo_regimen_ret_ganacia from poveedor p
    where p.codigo=:codigo
      into :exento,:codigo_regimen;
  if (exento='N') then
    begin
      select  Sum(op.total_neto_gravado) from ordenpago  op where
        extract( month from op.fecha)= extract (month from :fecha) and
        extract (year from op.fecha)=extract (year from :fecha)  and
        op.codigo=:codigo
          into :total;
      if (total is null) then
        total=0;
      select t.alicuota,t.minimo_no_imponible,t.concepto,t.impuesto_minimo from tasas_ret_ganancia t
        where t.codigo=:codigo_regimen
          into :tasa,:minimo_no_imponible,:concepto,:impuesto_minimo;
     /*Sumo los pagos de las retenciones aneriores */
      select Sum(ret.impuesto_retenido) from retenciones_ganancia ret where
        extract(month from ret.fecha)=extract (month from :fecha) and
        extract (year from ret.fecha)=extract (year from :fecha)  and
          ret.codigo_proveedor=:codigo
            into :pagos_anteriores;
      if (pagos_anteriores is null) then
        pagos_anteriores=0;
     /*************************/
     /*Sumo las Anulaciones */
      anulaciones=0;
      pagos_anteriores_aux=0;
      select Sum(a_ret.impuesto_retenido) from anulacion_retenciones_ganancia a_ret where
        extract(month from a_ret.fecha)=extract (month from :fecha) and
        extract (year from a_ret.fecha)=extract (year from :fecha)  and
          a_ret.codigo_proveedor=:codigo
            into :anulaciones;
      if (anulaciones is null) then
        anulaciones=0;
      /***************************/
      pagos_anteriores_aux=:pagos_anteriores-:anulaciones;
      pagos_anteriores=:pagos_anteriores_aux;
    end
  else
    begin
      tasa               =0;
      concepto           ='';
      minimo_no_imponible=0;
      exento             ='S';
      pagos_anteriores   =0;
      impuesto_minimo    =0;
    end
  if (exento = 'N') Then begin exento_id=0; end
    else begin exento_id = 1; end
  /* Procedure Text */
  /*suspend;*/
end

codigo Delphi

'delphi'>
Código Delphi [-]
   'keyword'>if DMMain_2.AgenteRetencionGanacia='quote'>'S' 'keyword'>Then
        'keyword'>begin
          QTraer_Pagos_Proveedor.Close;
          QTraer_Pagos_Proveedor.ParamByName('quote'>'CODIGO').AsString := Dato;
          QTraer_Pagos_Proveedor.ParamByName('quote'>'Fecha').AsDate    := CDSOPagoFECHA.AsDateTime;
          QTraer_Pagos_Proveedor.Open;'comment'>//ExecProc;

          'keyword'>if (QTraer_Pagos_ProveedorEXENTO.AsVariant='quote'>'N') 'keyword'>or
             (QTraer_Pagos_ProveedorEXENTO.AsString='quote'>'N') 'keyword'>or
             (QTraer_Pagos_ProveedorEXENTO.AsWideString='quote'>'N') 'keyword'>or (QTraer_Pagos_ProveedorEXENTO_ID.Value=0) 'keyword'>Then
            CDSOPagoRETIENE_GANACIAS.Value:='quote'>'S'
          'keyword'>else
            CDSOPagoRETIENE_GANACIAS.Value:='quote'>'N';
          'keyword'>if CDSOPagoTIPOIVA.Value<>1 'keyword'>Then
            CDSOPagoRETIENE_GANACIAS.Value:='quote'>'N';

          'keyword'>if CDSOPagoRETIENE_GANACIAS.Value='quote'>'S' 'keyword'>Then
            'keyword'>begin
              'comment'>// este es el Total de netos gravados del mes
              CDSOPagoTOTAL_PAGOS_DEL_MES.AsFloat          := QTraer_Pagos_ProveedorTOTAL.AsFloat;
              'comment'>// total de impuestos pagados
              CDSOPagoTOTAL_RETENIDO_MES.AsFloat           := QTraer_Pagos_ProveedorPAGOS_ANTERIORES.AsFloat;
              CDSOPagoTASA_RETENCION_GANACIA.AsFloat       := QTraer_Pagos_ProveedorTASA.AsFloat;
              CDSOPagoMINIMO_NO_IMPONIBLE_GANANCIA.AsFloat := QTraer_Pagos_ProveedorMINIMO_NO_IMPONIBLE.AsFloat;
              CDSOPagoCODIGO_REGIMENA_GANANCIA.Value       := QTraer_Pagos_ProveedorCODIGO_REGIMEN.AsInteger;
              CDSOPagoCONCEPTO_RETENCION_GANACIA.Value     := QTraer_Pagos_ProveedorCONCEPTO.AsString;
              CDSOPagoIMPUESTO_MINIMO_GANANCIA.AsFloat     := QTraer_Pagos_ProveedorIMPUESTO_MINIMO.AsFloat;
            'keyword'>end;
          QTraer_Pagos_Proveedor.Close;
        'keyword'>end;

Chaja 09-06-2011 15:46:10

Investigando , veo que me devuelve un reg. vacio... pero por que??? si desde el IBExperte me da resultados posibles?
sera por la fecha??
por que con el BDE no me pasaba y esto benditos DBX me dan tanto trabajo.....
ufffff

Casimiro Notevi 09-06-2011 16:02:17

Haces unas cosas muy extrañas:

Código:

if (QTraer_Pagos_ProveedorEXENTO.AsVariant='N') or
 (QTraer_Pagos_ProveedorEXENTO.AsString='N') or
 (QTraer_Pagos_ProveedorEXENTO.AsWideString='N') or
 (QTraer_Pagos_ProveedorEXENTO_ID.Value=0) Then

¿asvariant, asstring, aswidestring, value? ¿eso para qué sirve?, si el campo es un char, aunque veo que en el SP pones varchar(1).

¿?¿?¿?

Chaja 09-06-2011 16:07:16

Lo hice por que en algunos casos, si la tomo como string me da '' pero si lo tomaba como Wide me daba el valor... no se talvez esta al cuete, y no me daba valor por estar vacio el reg.
cosas que probas por que no sabes que hacer..... :D:D:D:D:D:D

Casimiro Notevi 09-06-2011 16:27:05

Cita:

Empezado por Chaja (Mensaje 403144)
Lo hice porque en algunos casos, si la tomo como string, me da ''

Claro, porque no devolvería nada, y nada.asstring=''

Chaja 09-06-2011 22:02:25

Solucion............
 
Bueno, no se por que pero la solucion la encontre sin querer
en el SP estaba

else begin exento_id = 1; end /* Procedure Text */ /*suspend;*/ end

por lo que saque el comentario del suspend, y funciono. no entiendo por que cuando estaba con el BD esto no pasaba.
en fin , si alguien tiene el por que estaria bueno saberlo
gracias a quienes leyeron mi inquietud


Luis Roldan
Mar del Plata
Argentina

Casimiro Notevi 09-06-2011 22:14:17

¿Quieres decir desde ibexpert?, a mí me ha pasado alguna vez que si pongo más de un comentario en la misma línea sale algún error.

Kipow 09-06-2011 22:18:27

El suspend es el la funcion que indica al procedure que devuelva valor, sino estabas ejecutandolo pues no te estaba devolviendo nada (null en los parametros de Delphi).

Todo Procedure en firebird que deseas que devuelva datos debe de ejecutar el Suspend 1 vez por cada fila que deseas obtener. en tu caso pues es 1 unica fila.


La franja horaria es GMT +2. Ahora son las 11:18:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi