La Web del Programador: Comunidad de Programadores
 
    Pregunta:  221 - DIFERENCIA ENTRE LOS COMANDOS DE CLIPPER
Autor:  Julio
Quisiera saber cual es la diferencia entre utilizar las funciones que Clipper ofrece con prefijo DB y sus mismos comandos, por ejemplo
DbSeek() con SEEK
DbSkip() con SKIP
DbAppend() con APPEND BLANK
DbGoto con GO
Tengo un libro de Clipper y éste dice que funcionalmente son iguales, entonces si son iguales porqué se implementan dichas funciones?

  Respuesta:  José Revoredo
La diferencia es clara amigo. Los comandos son por compatibilidad de las primeras funciones de clipper con los dbase III y FoxBase. Sin embargo Clipper internamente usa las funciones, también es cierto que si conoces el modo en que Clipper trabaja, podrías sacarle mayor provecho..utilizando las funciones de pre-procesador (modificar comportamiento de comandos originales -> STD.ch). Sin embargo, sugiero que uses funciones y no las cambies pues personalizas demasiado tus programas y para el mantenimiento futuro por otro programador es mas complejo.(No distinguiría un DELETE modificado del original) En verdad tu podrías traducir todo tu Clipper al español también (crear el comando BORRAR en vez de DELETE). Pero por estandarización no es recomendable, te sugiero usar funciones.

  Respuesta:  Gerardo A. Mendoza
Hola:
Espero que mi respuesta te aclare tu duda. Desde la versión 5.0 de Clipper se apostó por un sistema basado en funciones. Si creas un programa y lo compilas con la directiva /p (preprocesador) y revisas el listado .ppo, veras que son puras funciones. Por otra parte, por compatibildad con versiones anteriores y con los programadores de dBase se mantienen los comandos.
Dado que su funcionalidad es exactamente la misma, te recomiendo que uses las funciones, ya que esto te puede dar mayor potencial en la creación de tus propios comandos, psuedofunciones de usuario, funciones de usuario. Revisa el archivo; revisa el archivo STD.CH que se encuentra en el directorio INCLUDE y veras que todos los comandos utilizan el preprocesar para traducirlos a funciones.
Puedes comunicarte conmigo si tienes dudas en mi respuesta. :)

  Respuesta:  Jose Antonio Ramos
La diferencia entre utilizar comandos y funciones radica que dichas funciones pueden ser utilizadas con un alias de alguna area abierta y mediante el uso de comandos no seria posible.
Ejemplo:
Use emision new
use tasas new
do while .not. eof()
emision->(dbskip()) && mueve puntero emision
skip && mueve puntero tasas
enddo
Espero que haya sido claro y es bueno que haya gente que siga utilizando clipper.

  Respuesta:  Juan Reyes
Hola amigo, los comandos por algo existen en clipper, sabes porqué, porque el preprosesador de clipper ( opción /p ) los transformará a su equivalente dependiendo de con que CH se compile ( ojo ).
Es decir, afirmo lo que dijo José Antonio Ramos ( clara bien ) pero discrepo en una pequeña cosa con lo que mensionó Gerardo A. Mendoza en esto :

Te recomiendo usar comandos en vez de funciones, siempre se pueden usar comandos, cuando necesites utilizar un comando especificándole un alias hace para utilizar el comando ZAP :

FUNCTION JrZap()
ZAP
RETURN ( NIL )
para DELETE
FUNCTION JrDelete()
DELETE
RETURN ( NIL )
para PACK
FUNCTION JrPack()
PACK
RETURN ( NIL )

FUNCTION JrSkip()
SKIP
RETURN ( NIL )

así podrás utilizar con esto Clientes->( JrZap() ), Clientes->( JrSkip() ), etc.

Imagina un sistema mono usuario que solamente necesitas compilar y enlazar de nuevo para convertirlo para red. Te creas un .CH y en el defines

#Command DELETE => RLock() ; DbDelete() ; DbUnLock()
si utilizaste en tus sistemas el comando DELETE bastará compilar de nuevo y enlazar y tendras tu sistema corriendo para red (lógicamente con las bases de datos en modo SHARED, etc.) pero si utilizaste la función DbDelete() deberás darte el lujo de cambiar todos tus PRG.
Chao amigo,