¿Cómo realizo estas operaciones en PW?

Yo desarrollo en visual basic y estoy aprendiendo power builder 9, tengo algunas inquietudes, por ahora, de lo que hago en VB y deseo hacer en PW ya que estoy desarrollando un sistema de ventas en VB y a la vez quiero practicar en PW, te explico lo que hago en VB y al costado entre paréntesis lo que hago en PW:
En VB trabajo con la BD en access y en PW con la base de datos nativa (. Db) en Access la tabla Articulo tiene un campo artcodi que es la porque y que es de tipo text (7) y en PW es char(7). En el formulario cuando selecciono de un datacombo (dropdownlistbox) un tipo de articulo (q puede ser Insecticida o Fertilizante u otros más) deseo q para formar el código se tome la primera letra del texto del datacombo(dropdownlistbox)es decir I o F u otros seguido de ceros y al final el numero correlativo. Para saber cual es el código mayor de los artículos hago desde visual basic lo siguiente:
sql="select max(artcodi) from articulo where artcodi like '"& left(datacombo1.text,1) &"%'"
aca esta mi primer problema.En PW escribo lo siguiente:
select max(artcodi) into :val_m from articulo where artcodi like ?????
En esta parte como debo de formatear el resultado del dropdownlistbox para poderlo emplear en la consulta o hay otra forma de realizar esta operación.
Yo para resover el problema temporalmente realize lo siguiente:
if left(ddlb_1.text,1)='F' then
select max(artcodi) into :val_m from articulo where artcodi like 'F%';
end if
if left(ddlb_1.text,1)='I' then
select max(artcodi) into :val_m from articulo where artcodi like 'I%';
end if
Pero como veras esto no es lo más ideal ya se pueden seguir agregando más tipos y ahí surgiría el problema.
El otro problema q tengo es como puedo llamar al evento de un objeto. Por ejemplo desde VB para llamar a un evento hago lo siguiente:
call command1_click(0)
¿Desde PW como llamo al evento de un objeto?
Respuesta
1
Voy a empezar por la segunda pregunta, para llamar un evento desde power builder, debes colocar lo siguiente:
Objeto. TriggerEvent(evento)
Mira la ayuda de power builder. Allí hay unos ejemplos de como puedes hacer esto.
Para lo primero puedes hacer lo siguiente:
Antes de hacer el query saca la primera letra del código.
Esto lo puedes hacer así:
lc_var = Mid(dropdownlistbox.text,1,1)
Después para poder ejecutar el query y poder tener el valor que arroja, debes hacer lo siguiente:
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM "tu_Query" + "WHERE arcodi LIKE '" + lc_var + "%'";
OPEN DYNAMIC my_cursor ;
FETCH my_cursor INTO :max_codigo;
CLOSE my_cursor
Es un poco más elaborado que en Visual, pero es la forma de power, en este caso visual es más simple...
Espero te sirva.. que estés bien
Por favor verifica ti consulta. Parece que hay algunas opciones que están mal o estoy mal yo.Si es posible escríbela por favor
La tabla es articulo y el campo es artcodi, el dropdownlistbox es ddlb_1.
Te lo agradecería
Ok, creo que ya te debe funcionar... realice algunos cambios.
Char lc_var
String ls_maxcod
String ls_query
lc_var = Mid(ddlb_1.text,1,1)
ls_query = "SELECT MAX(artcodi) FROM articulo WHERE artcodi LIKE '" + lc_var + "%'"
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA
FROM :ls_query
USING SQLCA;
OPEN DYNAMIC my_cursor ;
FETCH my_cursor INTO :ls_maxcod;
CLOSE my_cursor ;
Me cuentas.

4 respuestas más de otros expertos

Respuesta
1
1. es PB no PW ;-)
2. Para llamar a un evento en PB es: botón. trigger event clicked()
3. Yo usaría la misma bd en access para no tener que mantener 2 bd. Con pb te podes conectar a access sin problemas.
4. Yo tendría una tabla de últimos números
5. Lo de los códigos:
Proba:
string ls_prefijo, ls_letra
ls_prefijo = "'" + ls_letra + "%'"
select max(artcodi) into :val_m from articulo where artcodi like :ls_prefijo;
No lo probé, si no anda avisame...
Saludos muchas gracias por tu pronta respuesta..
Mira lo que deseo es que al seleccionar una opción del dropdownlistbox el resultado sea parte de la consulta SQL. Con lo que me enviaste realice lo siguiente:
string ls_prefijo,val_m
ls_prefijo = "'" + left(ddlb_1.text,1) + "%'"
select max(artcodi)
into :val_m
from articulo
where artcodi like :ls_prefijo;
sle_2.text=val_m
Pero no me dio ningún resultado de que otra forma puedo realizar la consulta..
Otra pregunta: la aplicación que estoy desarrollando lo lleve a otra PC pero la Base de datos nativa de PB no se conecta, como hago para conectar la BD..
Muchas gracias
1. Estuve probando y esto si me anduvo:
Proba:
supongamos que articodi sea char(5)
string ls_prefijo, ls_letra
ls_prefijo = "'" + ls_letra + "%%%%'"
select max(artcodi) into :val_m from articulo where artcodi like :ls_prefijo;
Esto es porque el % es comodín para un solo char.
También probé con * pero no me anduvo.
(Yo estoy probando con access)
Si esto no te anda escribime que te paso como hacerlo con sql dinámico (pero con las mismas condiciones)
2. Tienes que hacer una pregunta a la vez.
La bd nativa de pb suele ser mono usuario por lo que si la tienes abierta en otra pc no te deja conectarte.
Si no fuera monousuario tienes que crear en la pc 'nueva' una conexión odbc o bien con los drivers nativos. Para que puedas hacerlo tienes que instalar el motor de la bd en la pc nueva así te instala los drivers para el odbc y los nativos
Respuesta
1
¿Según entiendo cuando cambias de valor en tu ddlb es cuando obtienes el máximo valor dependiendo de la selección en ddlb no?
Supongo que tienes un botón o algo así o código en tu evento 'selectionChanged'...
//----------------------
string lsSQL
integer val_m
lsSql=left(ddlb_1.text,1) + '%'
select max(artcodi)
into :val_m
from articulo
where artcodi like :lsSQL
//-------------
El sql no va a funcionar si lo usas '.. like :left(..'
Primero debes cargar la variable lsSql
la variable lsSQL se cargara con algo así como: 'C%'... dependiendo del valor de tu ddlb...
Hazme saber si te ayudo o si aun tienes problemas
Gracias por tu ayuda..
Aun sigo teniendo problemas, pero sabes cuando escribo la consulta de la siguiente manera:
string ls_prefijo,val_m
ls_prefijo = "'" + left(ddlb_1.text,1) + "%'"
select max(artcodi)
into :val_m
from articulo
where artcodi like :ls_prefijo;
sle_2.text=val_m
sle_3.text=ls_prefijo
El resultado en la caja de texto sl2_2 no aparece, pero en la caja sle_3 si aparece y es de la siguiente manera: 'F%' (dependiendo con que dígito empiece el código), es decir es justo lo que deseo, pero de igual manera no arroja ningún resultado. A mi parecer se debe a los dos puntos (:) que se le antepone a la variable, ¿o no es por eso?
Espero tu ayuda
Gracias por tu pronta respuesta en la segunda respuesta esta perfecta, pero en la primera creo que no lo explica muy bien, lo que deseo es capturar lo que selecciono del dropdownlisbox(ddlb_1) y pasarlo para que queda como parte de la consulta SQL. Un ejemplo
select max(artcodi)
into :val_m
from articulo
where artcodi like left(:ddlb_1.text,1);
Esta opción no me arroja nada debe de estar algo mal en la construcción de la consulta...
Por favor necesito ayuda urgente
Gracias
1)--------------
Ejem:
string lsSQL
lsSQL='C%'
select max(Campo) into :val_m from Tabla where Descripcion like :lsSQL;
2)------------
cb_1.triggerevent('clicked')
No debes incluir los símbolos de comilla sencilla cuando armas tu variable ls_prefijo...
Es decir debes de hacer:
ls_prefijo=left(ddlb_1.text,1) + '%'
despues del select puedes incluir esta linea para ver si hay error:
messagebox('Resultado',string(sqlca.SQLCode) +':'+string(sqlca.SQLDBCode)+':'+sqlca.SQLErrText)
Respuesta
1
Haz lo siguiente:
1) Asigna el valor en una variable:
ls_var = Left(ddlb_1.text,1)+"%"
luego escribes en el select
select max(artcodi) into :val_m from articulo where artcodi like :ls_var;
2) Command1. Triggerevent(Clicked!)
Cualquier duda solo pregunta.
Respuesta
1
Bien para tu primer problema lo que te recomiendo es hacer lo siguiente:
string ls_chars
ls_chars = left(ddlb_1.text,1)+ '%'
select max(artcodi) into :val_m from articulo where artcodi like :ls_chars;
De esa manera evitas el problema de si agregar nuevos tipos... es lo único que se me ocurre que podes hacer.
Respecto de como llamar al evento de un objeto:
objeto.event nombre_evento()
ejemplo:
w_ventana.event open()

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas