La Web del Programador: Comunidad de Programadores
 
    Pregunta:  158 - BASE DE DATOS EN UN ACHOISE
Autor:  Jorge
Quisiera que alguien me ayudara ya que perdí los apuntes y necesito lo siguiente:
Como puedo desplegar algunos campos de una base de datos en un achoise para mostrarlo por pantalla y selecionar un registro. Yo anteriormente la hacia pero hace años que no programo en clipper y no recuerdo.
Por ejemplo en un progrma de facturas al ingresar un campo de items me despliege en una persina los datos de los articulos, seleccionar un articulo, cerrar la persiana y continuar ingresando los datos de la factura. Yo lo hacia con achoice , pero no recuerdo como lo hacia.

  Respuesta:  José Revoredo
Es preferible que uses TBROWSE. El achoice es para arreglos y está limitado. Aparte que es todo un rollo para que puedas editar el archivo.
El DBEDIT pertenece al summer87 y es sostenida en Clipper 5.x por compatibilidad.

  Respuesta:  Cruz Alfredo Vasquez Ceja
Checa esto que yo utilizo, a ver si te sirve,
declare art[100]
declare can[100]
afill(art,0)
afill(can,0)
do leer // osea una funcion que lea la base de datos y que ponga los valores a los arreglos//

a=1
do while a <= 100
lina = str(art[a])+" "+str(can[a])
a = a + 1
enddo

sele = achoice(5,5,15,70,lina)

do case
case sele ....
apenas estoy aprendiendo clipper, a ver si te pudes comunicar conmigo, icq 36896964

  Respuesta:  Juan Reyes
Una cosa primero, un achoice comprende posiciones de memoria, es decir un arreglo, un achoice siempre tine que ser unidimensional (de una dimensión)
Lo que deberías hacer para poder listar campos de una base de datos es por medio de objetos TBrowse, que te permitiran ahorrar memoria y dar mayor flexibilidad y rapidez a tu aplicación, no así con arreglos ya que existe, y casi siempre que el inventario sea muy grande y quizas exceda los 4096 artículos, si es así, tendrás problemas al tratar de generar arreglos mayores a esta cantidad.
Ve la documentación del achoice.
Pero como lo necesitas :
Local aArticulos := {}
SELECT Inventa
Inventa->( DbGoTop() )
Do While Inventa->( !Eof() )
AAdd( aArticulos, Inventa->Codigo + Inventa->Articulo )
Inventa->( DbSkip() )
EndDo
Achoice( 10, 10, 24, 70, aArticulos )
Lo demás lo vez tú.
Pero te recomiendo utilizar objetos TBrowse.

  Respuesta:  Willser F. González C.
Hay tres formas sencillas de hacerlo.

1. La función ACHOICE se usa para crear opciones de menús emergentes. Entonces:

vRgstros := {}
select NmbreDbf
go top
while !eof()
aadd(vRgstros, sCmpo1 + sC mpo2 + ... + sCmpon);
skip
enddo
nOpcion = Achoice(y1,x1,y2,x2,vRgstros) // Opci¢n del //men£. nOpcion = N£mero de Registro seleccionado. //Tenga en cuenta que no halla filtros.
No olvide que un vector tiene un límite.

2. La función DBEDIT lista una DBF:

set key -2 to LeerCmpo // Activar F3 para seleccionar.
@10,10 say "Cliente" get cClnte Valid LeerCmpo(@cClnte)
read
set key -2 to // No olvide desactivar la tecla.
Function LeerCmpo(cVrble)
vCmpos := {} //Número de los campos a listar.
select NmbreDbf //Seleccionar la DBF.
for i := 1 to fcount() //Agregar campos al vector.
aadd(vCmpos, i)
endfor
dbedit(y1, x1, y2, x2, vCmpos) //Puede llamarse sin //parámetros.
if (lastkey() == 27) // Esc. No seleccionó cliente.
return(.f.)
cVrble := NmbreClnte // O como se llame el campo.
return(.t.)
3. TBROWSE // Parecida al DBEDIT.
Nota: Debe implementar una función que llame al ACHOICE o al TBROWSE al pulsar una tecla de función u otra cuando esté leyendo la variable con SET KET TO parecida a LeerCmpo(...).
Para más información envíame un E-Mail

  Respuesta:  Jose Antonio Holgado Loza
Yo esto lo hago con una DBEDIT sobre la tabla contra la que vas a consultar. Con la función de usuario controlas por ejemplo la pulsación de y al pulsar sales de la DBEDIT y devuelves el campo que te interese del registro actual de la tabla consultada.
Un saludo.