|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Brroz
Páginas: 1 ... 38 39 [40] 41 42 43
976
« en: Miércoles 27 de Agosto de 2003, 09:06 »
Aúnque ignoro como recibir el valor del parámetro de vuelta, se me ocurre que podrías escribir el resultado en un archivo de texto temporal y recuperarlo desde ahí.
Tal vez se podría hacer también escribiendo el valor que quieres devolver en una determinada dirección de memoria para luego recuperarlo con la api 'CopyMemory'...
Esperemos que alguien por ahí aporte alguna solución que vaya mejor.
Suerte.
977
« en: Miércoles 27 de Agosto de 2003, 08:56 »
Utiliza la instrucción de esta forma:
SHELL "MiPrograma.Exe Parametro"
'MiPrograma.Exe' recibirá el valor de 'Parametro' en el objeto 'Command', de forma que obtendrás lo especificado en 'Parametro' como una cadena de texto en la que tú deberás identificar el o los distintos parámetros que hayas escrito.
Mira este ejemplo.
Desde el programa que hace la llamada:
SHELL "MiPrograma.Exe Hola"
Desde 'MiPrograma.Exe:
Private Sub Main Dim strCmd as string strCmd = Trim(Command) If strCmd = "" then Msgbox "No hay parámetros" Else Msgbox "Parámetro: " & strCmd End if End Sub
Suerte.
978
« en: Miércoles 27 de Agosto de 2003, 08:45 »
Si conoces las direcciones IP o nombres de los pcs y tienes en ellos carpetas compartidas, no hay mayor problema, usa FileCopy.
Un detalle: ahora mismo tengo la duda de si algo del estilo 'FileCopy MiExec.Exe 123.123.123.123CarpetaTuExec.Exe' funciona. Si usamos el nombre del pc en vez de la IP, te aseguro que funciona, pero si sólo tienes la IP... Si en tu caso sólo conoces la IP, podrías hacer varias cosas: 1- Asignar previamente la ruta '123.123.123.123Carpeta' a una unidad, 2- Ejecutar con SHELL el programa NET con el parámetro USE (NET USE unidad ruta), (escribe en una pantalla DOS para obtener ayuda NET HELP), 3-Editar el archivo Host o LMHost para asignar un nombre a la dirección IP.
Espero que te sirva. Suerte.
979
« en: Miércoles 27 de Agosto de 2003, 08:32 »
La solución más sencilla es usar la correspondiente sentencia SQL como origen de registros para tu informe. La sintáxis de la sentencia sería de este estilo:
SELECT a.Campo1 , a.Campo2, a.CampoN, b.Campo1, b.CampoN FROM Tabla1 AS a LEFT JOIN Tabla2 AS b ON a.CampoN=b.CampoN
Es decir, en una sola consulta obtienes un recordset con todos los datos que te hagan falta a partir de las distintas tablas.
Ten en cuenta que la sintáxis de la sentencia puede variar (aunque poco) dependiendo del proveedor de la base de datos. Otro detalle está en la palabra clave de unión (LEFT JOIN en el ejemplo) que podría ser INNER JOIN, RIGHT JOIN, EXCEPTION JOIN , JOIN ... dependiendo de la unión que quieras hacer y las relaciones entre las tablas. Si tienes problemas para construir la sentencia, te recomiendo que si usas una base de datos jet, utilices el generador de consultas de Access, uses la vista SQL de la consulta y observes como es la correspondiente sentencia SQL.
Sort.
980
« en: Martes 26 de Agosto de 2003, 08:23 »
If Val(Text1.Text) < 0 Then Msgbox "¡Negativo!"
Sort.
981
« en: Lunes 25 de Agosto de 2003, 13:52 »
Si te da ese mensaje puede ser por una de las razones siguientes: - El sistema no puede reconocer la clase 'SpecialFolders' en la biblioteca 'Toolsack'. - No se puede encontrar la biblioteca 'Toolsack'. - La biblioteca 'Toolsack' no está correctamente registrada.
Aupa.
982
« en: Lunes 25 de Agosto de 2003, 13:46 »
El fallo está en que debes inicializar la variable m_wsShell como un objeto antes de usar ningún miembro de la misma. Hazlo tal que así:
Set m_wsShell = CreateObject("WScript.Shell")
Acuerdate de hacer cuando acabes Set m_wsShell = Nothing para liberar la referencia al objeto.
Me imagino que con esto arreglarás. Aupa.
984
« en: Lunes 25 de Agosto de 2003, 12:14 »
La 'traducción' del SQL sería algo así como...
Añade a TABLA2 todos los registros de TABLA1 que cumplan la condición de que el valor de su CAMPO CLAVE (o no clave, o varios campos en vez de uno,... pero no nos liemos) no se encuentre en el CAMPO equivalente de la TABLA2.
Es decir:
Tabla1 = Tabla original Tabla2 = Clon de Tabla1 CampoTabla1 = Campo de Tabla1 que identifica el registro (podrías usar varios campos, vaya clave unica.) CampoTabla2 = equivalente a CampoTabla1 pero en Tabla2.
Pero ojo con una cosa: este SQL no te garantiza que las dos tablas vayan a contener los mismos registros (pudiera ser que Tabla2 tuviera otros registros que no están en Tabla1). Podrías usar un SQL similar pero a la inversa, actualizando Tabla1.
También podrías hacer otra cosa (santo remedio) si el número de registros te lo permite):
DELETE FROM Tabla2
INSERT INTO Tabla2 SELECT * FROM Tabla1
Espero haberme expresado con algo más de claridad.
Sort.
985
« en: Lunes 25 de Agosto de 2003, 12:00 »
Muchas gracias por tu respuesta.
Lo más lógico era suponer que sucediera como me cuentas, al fin y al cabo Dim es una instrucción, y mientras no se ejecute entiendo que no se debería notar ningún efecto. La incógnita para mi era si una vez que el programa se compila sigue ocurriendo lo mismo. Bueno, me iré acostumbrando a declarar las variables conforme las vaya necesitando...
Muchas gracias de nuevo y recibe un cordial saludo.
986
« en: Lunes 25 de Agosto de 2003, 10:56 »
Sería tan sencillo como leer el registro de una tabla y grabarlo en la otra con AddNew (si el registro no existe) o Edit (si existe) o con un SQL (INSERT o UPDATE).
Si lo que necesitas es actualizar la tabla con los registros de la otra que no existen en la primera y sin saber que registros son estos (o cuántos son), podrías hacer un proceso de actualización con un SQL de este estilo:
INSERT INTO Tabla2 SELECT * FROM Tabla1 WHERE CampoTabla1 NOT IN (SELECT CampoTabla2 FROM Tabla2)
A ver si te vale. Sort.
987
« en: Lunes 25 de Agosto de 2003, 10:41 »
Hace tiempo que me pregunto si es indiferente el momento en que se declara cada variable dentro de una sub o función. Normalmente declaro las variables al comienzo del procedimiento, más que nada por verlas todas juntas, pero cada vez que hago esto se me plantea la siguiente cuestión: Si una variable de las declaradas sólo se usa cuando se cumple una determinada condición tal vez convendría declararla en el momento que se va a usar. Es decir, imaginaos un código de este estilo
Dim lng1 as Long , lng2 as Long
If Condicion Then lng1 = 111111 Msgbox lng1
Exit Sub
Else Lng1 = 222222 Lng2 = 333333 . . . End If
Supongo que si defino las variables al principio automáticamente se asigna memoria para ellas. Sin embargo, si hago lo siguiente
Dim lng1 as Long If Condicion Then lng1 = 111111 Msgbox lng1
Exit Sub
Else lng1 = 222222 Dim lng2 as Long lng2 = 333333 . . . End If
¿Si se cumple la condición me he ahorrado el espacio en memoria para lng2? Sospecho que realmente es así pero me gustaría confirmarlo.
Saludos a todos.
988
« en: Lunes 25 de Agosto de 2003, 09:03 »
El evento SendProgress del control winsock devuelve como parámetros los bytes enviados desde la última vez que se desencadenó el evento y los bytes que quedan en el buffer. Creo que con esto encontrarás lo que buscas.
Suerte
989
« en: Lunes 25 de Agosto de 2003, 08:57 »
Se podría probar con algo así:
Private Function ChkRegCom() as Boolean On error Goto Error_Registro Dim obj1 as Object Set obj1 = CreateObject("NombreDeClase") ChkRegCom = True Salir_Registro: Set obj1 = Nothing Exit Function Error_Registro: If Err.Number <> 429 Then MsgBox(Err.Number & " " & Err.Description, vbCritical, "Error") Resume Salir_Registro End Function
Si no se puede crear la clase "NombreDeClase", se desencadenará un error 429 (el componente activeX no puede crear el objeto), con lo que abría que registrarlo.
También podríais crear una clave en el registro con datos de vuestra aplicación y chequearla antes de llamar al programa que crea los componentes.
Espero que esto sirva para vuestros propósitos. Suerte.
990
« en: Viernes 22 de Agosto de 2003, 08:30 »
Para averiguar en que directorio está instalado windows y cúal es el directorio del sistema (independientemente de la versión) puedes utilizar el siguiente código:
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Function WindowsSysDir() as String Dim strDir As String strDir = Space(255) GetSystemDirectory strDir, 255 WindowsSysDir = left(strDir, Instr(1,strDir,Chr(0))-1) End Function
Ten en cuenta que windows no siempre está instalado en el mismo directorio.
Espero que esto te sirva. Suerte.
991
« en: Jueves 21 de Agosto de 2003, 13:22 »
No te preocupes hombre... Hace poco leí en no se dónde: "No hay preguntas tontas, sino tontos que no preguntan".
En tiempo de diseño abre la página de propiedades del control, selecciona la pestaña 'Diseño', elige la columna que quieras y modifica la alineación en los combos correspondientes.
En tiempo de ejecución: DataGrid1.Columns(2).Alignment = dbgLeft Por ejemplo.
Sort.
992
« en: Jueves 21 de Agosto de 2003, 13:01 »
Suponiendo que tienes la imagen original en un PictureBox llamado Picture1 y que quieres copiar un trozo de esa imagen a otro PictureBox llamado Picture2, puedes hacer los siguiente.
Declara a nivel de módulo:
Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Luego cuando quieras hacer la copia
Dim lngRc As Long lngRc = BitBlt(Picture2.hDC, x2, y2, Ancho, Alto, Picture1.hDC, x1, y1, &HCC0020)
Donde: x2 , y2 = coordenada en el pictbox en la que quieres copiar la imagen Ancho y Alto = Ancho y alto del cuadrado a copiarse x1,y1=coordenada desde donde copiar el cuadrado en el pictbox origen.
Espero que esto te sirva. Suerte.
993
« en: Jueves 21 de Agosto de 2003, 08:52 »
A ver si me aclaro...
En principio no veo la necesidad de que las historias clínicas vayan en la tabla ordenadas como indicas, ya te ocuparás tú al darles salida de ordenarlas. Lo único que se me ocurre por lo que puedas necesitar tener los registros ordenados en la tabla es que tuvieras la necesidad de asignar un cierto número consecutivo a esos historiales. Es decir, Del número 1 al 500, historiales con 'A' , del número 501 al 100, historiales con 'B', etc. Aún en este caso no tienes necesidad de grabar ordenadamente. Necesitarás un campo en la tabla de historiales para almacenar el número que quieres asignar (que este indexado preferiblemente) y otra tabla para controlar la numeración asignada a cada letra de apellido. Algo así:
Numero_Desde Numero_Hasta Letra 1 500 A 501 1000 B . . . . . . 100001 100500 Z
Esta tabla la tendrías que actualizar cuando el número de historiales en el intervalo de la letra se te quedara corto. Si no tuvieras las tablas correctamente relacionadas, también tendrías que actualizar los números de la tabla de historiales. Ten entonces en cuenta que el número de los historiales puede variar. Si quieres evitarlo debes hacer el intervalo para cada letra lo suficientemente grande y añadir de alguna forma al número de cada historial el año, de forma que puedas reutilizar anualmente los números del intervalo definido.
En fin... no sé si esto realmente se ajusta a tú caso y no me habré enrrollado mucho.De todas formas no puedes esperar que en un foro alguien te haga el análisis de una aplicación, eso debes currártelo tú, pero algunas ideas seguro que te valen.
Espero que te sirva. Suerte.
994
« en: Jueves 21 de Agosto de 2003, 08:32 »
Para registrar tu componente:
Shell "REGSVR32 /S RutaNombreComponente.ocx"
El modificador /S es para registrar en modo silencioso. Si quieres desregistrar utiliza el modificador /U.
Suerte.
995
« en: Jueves 21 de Agosto de 2003, 08:24 »
Donde dice:
rsbusca.Source = "select p.idproducto, p.nombreproducto, p.idcategoría, p.cantidadporunidad, p.preciounidad, c.NombreCategoría from productos p, categorías c where p.idcategoría=c.idcategoría and nombreproducto like '" & Text1.Text & "%' order by nombreproducto"
Debería decir:
rsbusca.Source = "select p.idproducto, p.nombreproducto, p.idcategoría, p.cantidadporunidad, p.preciounidad, c.NombreCategoría from productos p, categorías c where p.idcategoría=c.idcategoría and nombreproducto like '" & Replace(Text1.Text, Chr(29), Chr(180)) & "%' order by nombreproducto"
Por otro lado si metes este código en el evento Change del TextBox, cada vez que el usuario pulse una tecla y se modifique el contenido del textbox, se desencadenará el evento y la consiguiente consulta, cosa que no creo que te interese. Puedes programar el evento Validate (ojo con la propiedad CauseValidation del resto de los controles) o puedes utilizar el evento LostFocus o puedes añadir un CommandButton o algo así para ejecutar la consulta.
A ver si esto te sirve. Suerte.
996
« en: Miércoles 20 de Agosto de 2003, 13:46 »
Te aseguro que no hay color de utilizar las api's a gestionar tú mismo el fichero de texto, y ya no digamos de usar SaveSetting, GetSetting, pero como para gustos hay colores y para problemas, soluciones, pues que cada uno vea lo que mejor le conviene.
Un saludo.
997
« en: Miércoles 20 de Agosto de 2003, 09:09 »
Cuando concatenes o montes la sentencia SQL , puedes hacer lo siguiente:
Replace(Text1.Text, Chr(29), Chr(180))
Que es ni más ni menos que sustituir el carácter ' (Chr(29)) por ´ (Chr(180)). Luego, a la hora de presentar el campo si te importa el que el carácter esté cambiado, haz el proceso contrario:
Text1.Text = Replace(Recordset1.Fields(0).Valur, Chr(180), Chr(29))
Otra cosa que podrías hacer es en el evento 'KeyPress' del TextBox, cambiar la pulsación de ' por ´ o otro carácter que tu vieras:
If KeyAscii = 29 Then KeyAscii = 180
Espero que esto te sirva de ayuda. Suerte.
998
« en: Miércoles 20 de Agosto de 2003, 08:54 »
No comprendo muy bien lo rebuscado de la forma que planteas en el tema.
Yo introduciría los pacientes en la tabla que tengas para ello, que de seleccionar los que comiencen por una letra y de ordenarlos ya se encargará la correspondiente consulta, que para eso existen los índices de las tablas.
Por ejemplo, cuando quieras seleccionar los que comiencen por 'C':
SELECT * FROM TablaPacientes WHERE Left([Apellido],1) = 'C' ORDER BY Apellido
Suerte.
999
« en: Miércoles 20 de Agosto de 2003, 08:38 »
Prueba con algo de este tipo:
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Private Function LeerIni(ByVal IniFile As String, ByVal Seccion As String, ByVal Clave As String, Optional ByVal DftValor As String) As String
Dim lng1 As Long LeerIni = Space(255) lng1 = GetPrivateProfileString(Seccion, Clave, DftValor, LeerIni, 255, IniFile) LeerIni = Left(LeerIni, lng1) End Function
Private Sub EscribirIni(ByVal IniFile As String, ByVal Seccion As String, ByVal Clave As String, ByVal Valor As String)
Dim lng1 As Long lng1 = WritePrivateProfileString(Seccion, Clave, Valor, IniFile) End Sub
Otra forma muy sencilla sería utilizando el registro. Podrías utilizar las apis necesarias para crear tus claves en la sección del registro que necesitaras, pero más sencillo y despreocupado resultaría utilizar 'SaveSetting' para guardar los valores de las propiedades y 'GetSetting' para recuperarlos, y luego 'DeleteSetting' cuando quieras borrar la propiedad del registro.
Espero que esto te vaya bien. Suerte.
1000
« en: Martes 19 de Agosto de 2003, 12:57 »
Si en tu caso el TextBox NO ESTÁ ENLAZADO al control data, entonces probablemente lo que ocurre es que el código que actualiza el valor (del estilo 'Adodc1.Recordset.Fields(1).Value = Text1.Text') para el campo correspondiente en el recordset se encuentra en un evento que no se desencadena: - Si el código está en el evento 'Change', entonces es que el valor del texto es el mismo que el que asignas por código. - Si el código está en el evento 'KeyPress' o 'KeyDown' o 'KeyUp', entonces es evidente que si no se produce una pulsación de teclas, no se desencadena el evento.
Si el TextBox ESTÁ ENLAZADO al control data, entonces... debería actualizar el valor él solito. No sé cual podría ser el problema.
Espero que esto te sirva. Sort.
Páginas: 1 ... 38 39 [40] 41 42 43
|
|
|