El Perpetuo Novato de la Entrada de Registro #8.1
Este artículo apareció por primera vez en http://www.undu.com
a Medida que descubre las alegrías de permitir a los usuarios hacer consultas ad hoc, también descubre que reaccionar a sus opciones después de que el hecho no es siempre una alegría.
Si usted no sabe LO que las columnas van a ser incluidos en la consulta, usted tiene dos maneras de afrontar las columnas después del hecho. La primera es la fuerza bruta, la comparación de los nombres de campo con una lista de todas las opciones posibles y reaccionar en consecuencia. Alternativamente, usted puede conseguir el tipo de campo de información de Delphi y escribir un poco apretado de rutina.
PERO hay un problema. Usted va a estar usando algunos interno de Delphi constantes como ftSmallInt, ftBoolean y ftString. Así que, naturalmente, cuando se desea obtener la información, usted probablemente tendrá que pedir ObjectName.fieldType y ser confundido cuando el compilador eructa y se niega a continuar. Eso es porque la propiedad que usted DEBE hacer para es Tipo de datos. Sí, sé que es confuso en cuanto a por qué las constantes no podía tener el mismo DT como la llamada de la propiedad, pero de tales anomalías son artículos escritos aquí en la web.
Usted puede hacer algunas cosas con este código una vez que sabemos el tipo de campo de cualquier columna. Usted puede tener un total de un resultado de la consulta y hacer algunos análisis estadístico. Por ejemplo, configurar una red y una consulta conectados a él. Permitir la consulta de algún tipo de consulta ad hoc por cualquier medio que desee. Tiene un campo memo sentado debajo de la cuadrícula. El bucle a través de los campos, el recuento de los incidentes de los campos de cadena, con un total de campos numéricos y de la producción de Verdadero/Falso total de las estadísticas de campos booleanos. Incluir cada columna del resumen como una línea en la nota.
Mi propio uso, estuvo involucrado en la creación especializado en la hoja de cálculo en Excel, utilizando Axolot Datos del XLSReadWrite componente (disponible en http//www.axolot.com/components/index.htm). Ser capaz de diferenciar PO números que fueron ocasionalmente TODOS los números como una cadena en lugar de ello, permitió adecuada a la izquierda/derecha justificación de los resultados. La esencia de la función que hace que se enumeran a continuación
var
& nbsp & nbsp Fila,Col entero
& nbsp & nbsp s string
begin
& nbsp & nbsp // sólo continuará si la consulta Q es activo y lleno de
& nbsp & nbsp if ((P. activo) y (P. recordCount > 0))
& nbsp & nbsp & nbsp & nbsp, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp XLSW.Filename = 'C/data/' eXLS.Texto'.xls'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xlsW.OpenFile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp P. primera
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila = 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras no P. eof do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // escribir los encabezados de columna con el nombre de campo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para Col = 0 a (P. fieldCount - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xlsW.WriteString(Col,0,2,letras mayúsculas(q.campos[col].fieldname))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // bucle a través de las columnas y de exportación de cada célula para XLSReadWrite
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para Col = 0 a (P. fieldCount - 1) do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s = q.campos[Col].asString
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // utilizar el campo de la propiedad tipo de datos, NO fieldType!!!!!
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // ya que estos son miembros de una enumarated conjunto, puede utilizar un Caso...
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso q.campos[Col].tipo de datos
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftSmallInt xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftWord xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftFloat xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftBCD xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftInteger xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftLargeInt xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftBoolean si mayúsculas(S) = 'TRUE' // true casilla de verificación
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego xlsW.WriteBool(Col,Fila,3,true)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp cosa si mayúsculas(S) = 'FALSE' // false
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego xlsW.WriteBool(Col,Fila,3,falso)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp demás xlsW.WriteString(Col,Fila 2,')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // todo lo demás es una cadena, incluyendo las fechas
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp demás xlsW.WriteString(Col,Fila 2,S)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp q.siguiente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila = Fila 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xlsW.closeFile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp demás showDlgOops('No hay datos para exportar!')
fin
Como puedo saber el enigma de la identificación del tipo de campo es una pregunta muy común en los diversos Delphi grupos de noticias, espero que esto los llevará a una solución a su dilema. Y espero que te anime a dar a sus usuarios consultas ad hoc de la capacidad. A ellos les encantará!
Gary Mugford
Idea Mecánico
Bramalea EN Canadá
De que tipo es!
De que tipo es! : Multi-millones de consejos para hacer su vida mas facil.
El Perpetuo Novato de la Entrada de Registro #8.1
Este articulo aparecio por primera vez en http://www.undu.com
a Medida que descubre las alegrias de permitir a los usuarios hacer consultas ad hoc, tambien descubre que reaccionar a sus opciones despues de que el hecho no es siempre una alegria.
Si usted no sabe LO que las columnas van a ser incluidos en la consulta, usted tiene dos maneras de afrontar las columnas despues del hecho. La primera es la fuerza bruta, la comparacion de los nombres de campo con una lista de todas las opciones posibles y reaccionar en consecuencia. Alternativamente, usted puede conseguir el tipo de campo de informacion de Delphi y escribir un poco apretado de rutina.
PERO hay un problema. Usted va a estar usando algunos interno de Delphi constantes como ftSmallInt, ftBoolean y ftString. Asi que, naturalmente, cuando se desea obtener la informacion, usted probablemente tendra que pedir ObjectName.fieldType y ser confundido cuando el compilador eructa y se niega a continuar. Eso es porque la propiedad que usted DEBE hacer para es Tipo de datos. Si, se que es confuso en cuanto a por que las constantes no podia tener el mismo DT como la llamada de la propiedad, pero de tales anomalias son articulos escritos aqui en la web.
Usted puede hacer algunas cosas con este codigo una vez que sabemos el tipo de campo de cualquier columna. Usted puede tener un total de un resultado de la consulta y hacer algunos analisis estadistico. Por ejemplo, configurar una red y una consulta conectados a el. Permitir la consulta de algun tipo de consulta ad hoc por cualquier medio que desee. Tiene un campo memo sentado debajo de la cuadricula. El bucle a traves de los campos, el recuento de los incidentes de los campos de cadena, con un total de campos numericos y de la produccion de Verdadero/Falso total de las estadisticas de campos booleanos. Incluir cada columna del resumen como una linea en la nota.
Mi propio uso, estuvo involucrado en la creacion especializado en la hoja de calculo en Excel, utilizando Axolot Datos del XLSReadWrite componente (disponible en http//www.axolot.com/components/index.htm). Ser capaz de diferenciar PO numeros que fueron ocasionalmente TODOS los numeros como una cadena en lugar de ello, permitio adecuada a la izquierda/derecha justificacion de los resultados. La esencia de la funcion que hace que se enumeran a continuacion
var
& nbsp & nbsp Fila,Col entero
& nbsp & nbsp s string
begin
& nbsp & nbsp // solo continuara si la consulta Q es activo y lleno de
& nbsp & nbsp if ((P. activo) y (P. recordCount > 0))
& nbsp & nbsp & nbsp & nbsp, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp XLSW.Filename = 'C/data/' eXLS.Texto'.xls'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xlsW.OpenFile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp P. primera
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila = 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras no P. eof do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // escribir los encabezados de columna con el nombre de campo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para Col = 0 a (P. fieldCount - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xlsW.WriteString(Col,0,2,letras mayusculas(q.campos[col].fieldname))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // bucle a traves de las columnas y de exportacion de cada celula para XLSReadWrite
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para Col = 0 a (P. fieldCount - 1) do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s = q.campos[Col].asString
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // utilizar el campo de la propiedad tipo de datos, NO fieldType!!!!!
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // ya que estos son miembros de una enumarated conjunto, puede utilizar un Caso...
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso q.campos[Col].tipo de datos
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftSmallInt xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftWord xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftFloat xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftBCD xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftInteger xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftLargeInt xlsW.WriteNumber(Col,Fila 1,StrToFloat(s))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ftBoolean si mayusculas(S) = 'TRUE' // true casilla de verificacion
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego xlsW.WriteBool(Col,Fila,3,true)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp cosa si mayusculas(S) = 'FALSE' // false
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego xlsW.WriteBool(Col,Fila,3,falso)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp demas xlsW.WriteString(Col,Fila 2,')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // todo lo demas es una cadena, incluyendo las fechas
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp demas xlsW.WriteString(Col,Fila 2,S)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp q.siguiente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila = Fila 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xlsW.closeFile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp demas showDlgOops('No hay datos para exportar!')
fin
Como puedo saber el enigma de la identificacion del tipo de campo es una pregunta muy comun en los diversos Delphi grupos de noticias, espero que esto los llevara a una solucion a su dilema. Y espero que te anime a dar a sus usuarios consultas ad hoc de la capacidad. A ellos les encantara!
Gary Mugford
Idea Mecanico
Bramalea EN Canada