Búsqueda de dato en la BD

Primero Como podría validar una ventana de una manera optima de que todos los datos de dicha ventana sean ingresados.
Segundo si ingreso un numero de documento, antes de guardarlo me busque en la base de datos si se encuentra ya grabado, si es SI, mensaje de error, sino que grabe.
Respuesta
1
1. Sobre el caso de buscar un numero de documento lo podrías hacer de la siguiente forma.
Li_numero vendria hacer el codigo de numero que generaste para ingresar en la base de datos
Integer li_up
Long ll_existe
Select isNull(Count(*),0)
Into :ll_existe
From t_documento
Where t_semanas.numero = :li_numero;
If ll_existe > 0 Then // Verifica encontro algun documento
 Messagebox("Aviso","El numero generado de documento que desea guardar ya existe")
Else
   li_up = dw_1.Update()
   If li_up = 1 Then
      Commit;
   Else
       Rollback;
       Messagebox("Aviso Error","Grabacion fallo",StopSign!)
   End IF
End If
2. Sobre la validación yo igual ando en eso lamento no poder ayudarte, buscare una función que me pasaron hace algún tiempo y te la mando.
Ok amigo espero tons esa función de validación, pero desearía que cuando es optima la situación me salga un mesaje como (Espere un momento..) y se borre hasta cuando aya culminado el proceso de grabación en las tablas.
Esta es la función.
$PBExportHeader$f_findrequired.srf
global type f_findrequired from function_object
end type
forward prototypes
global function integer f_findrequired (datawindow adatawindow)
end prototypes
global function integer f_findrequired (datawindow adatawindow);long    row = 1
integer  colnbr = 0
long   ll_temp
string     colname, ls_temp
dwitemstatus dwstatus
Integer ll_return
DO WHILE row <> 0
                colnbr++            
                IF adatawindow.FindRequired(Primary!,row, colnbr, colname, FALSE) < 0 THEN RETURN 1
                IF row <> 0 THEN
                               dwstatus = adatawindow.getitemstatus (row,0,Primary!)
                               if dwstatus = new! or dwstatus = newModified! or dwStatus = DataModified!   then
                                               MessageBox("Advertencia","Ingrese un valor donde indica el cursor")
                                               adatawindow.scrolltorow(row)
                                               adatawindow.setcolumn(colname)
                                               adatawindow.setfocus()
                                               /* anula redibujo */
                                               adatawindow.SetRedraw(FALSE)
                                               /* destruye */
                                               adatawindow.Modify( "destroy r_indicador")
                                               /* crea */                                          
                                               adatawindow.Modify(&
                                                                              ' create rectangle(band=Detail'  +  &
                                                                              ' pointer=~'Arrow!~''+&
                                                                              ' moveable=0  '+&
                                                                              ' resizeable = 0 '+&
                                                                              ' x= ~''+ string(long(adatawindow.Describe(colname+".X")) - 20 ) +'~''+&
                                                                              ' y= ~''+ string(long(adatawindow.describe(colname+".Y")) - 20 )+'~''+&
                                                                              ' height=~''+ string(long(adatawindow.Describe(colname+".height")) + 40 ) +'~''+&
                                                                              ' width=~'' + string(long(adatawindow.Describe(colname+".width")) + 40 ) +'~''+&
                                                                              ' name=r_indicador' + &
                                                                              ' brush.hatch=~'7~'' + &
                                                                              ' brush.color=~'553648127~' pen.style=~'0~' pen.width=~'5~' pen.color=~'16711680~' background.mode=~'1~' background.color=~'553648127~')')
                                               /* activa redibujo */
                                               adatawindow.SetRedraw(TRUE)
                                               return -1
                               end if
                END IF
LOOP
Return 1
end function
Esta función devuelve un 1 0 -1 si falta llenar algún campo y señala el campo con un recuadro, recuerda que a los campos debes asignarle la propierda Required en el painter, espero que la mejores y me des tus comentarios.
Nota: Tienes que pasarle como argumento el dw, saludos si te sirvió finaliza la pregunta.

2 respuestas más de otros expertos

Respuesta
1
Respondiendo tu pregunta...
Si esto es en una datawindow, puedes usar un if en cascada, obteniendo cada campo con un getitemstring o getitemnumeber, dependiendo el tipo del campo que corresponda a cada uno.
En lo segundo..
Te puedo sugerir dos métodos, la primera que en el botón que uses para guardar, primero obtengas el numero de documento, hagas una consulta a la bd para verificar y condicionar con un if.
Otra que no es muy eficiente, si es una datawindow en el evento item change del dw, haz la consulta y verifica si esta o no el docto para lanzar o no la alerta.
Si quieres algún código de referencia.. me lo puedes solicitar.
Si pudieras hacerme un ejemplo con código, seria de mucha utilidad
//evento clic de tu boton
//esto es para cada campo en tu dw
if isnull(tu_dw.getitemnumber( tu_dw.getrow(),"tu_campo")) then
    messagebox("Aviso","Debe ingresar el numero del docto")
    return
end if
//funciones
//getitemstring  caracteres, cadenas etc
//getitemnumber obviamente numeros
//getitemdate y getitemdatetime para fechas dependiendo el tipo de dato
//cuando hayas
int documento, docto_nuevo
select docto into :documento
from tu_tabla
where docto=:docto_nuevo;
//si documento es numero haslo asi, si no tratalo como string
if documento>0 then
    messagebox("aviso","este docto ya fue ingresado")
    return
else
    if tu_dw.update()=1 then
        commit using sqlca;
        //algun codido o msj
    else
        rollback using sqlca;
        //algun codigo o msj
    end if
end if
Respuesta
1
Lo primero, no hay mejor manera que campo a campo con IF.
string ls_nombre
dw_cliente.accepttext()
ls_nombre = dw_cliente.getitemstring(dw_cliente.getrow(),'columna_nombre')
If isnull(ls_nombre) or trim(ls_nombre)="" then
messagebox("Validacion","Ingrese el nombre de Cliente",exclamation!)
dw_cliente.setfocus()
return
end if
******************************************************************
¿Lo segundo dime como trabajas el registro de datos CON INSERT embebido o con DataWindows?
con insert amigo
string ls_cod, ls_nuevo_codigo, ls_nom
ls_nuevo_codigo = sle_codigo.text
ls_nom = sle_nombre.text
select id_cliente into :ls_cod from clientes where id_cliente = :ls_nuevo_codigo using sqlca;
if ls_cod = ls_nuevo_codigo then
<mensaje de registro ya existente>
return
end if
insert into clientes values (:ls_cod,:ls_nom) using sqlca;
if sqlca.sqlcode=-1 then
rollback using sqlca;
<mensaje de error al guardar>
en dif
<mensje de actualizacion exitosa>
commit using sqlca;
Muchas gracias por tu ayuda amigo
Podrías finalizar la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas