我已经使用组件DbLookUpComboBox来显示客户列表,并且它工作正常,问题是,当我选择其中一个值时,它只是忽略我的选择并在组件处留下空白值。
这是我的名单来源:
DECLARE @ID_USR INT
DECLARE @FOUND BIT
SET @ID_USR = :ID_USUARIO
SET @FOUND = 0
SELECT @FOUND = 1
FROM
DBUSUARIO U
INNER JOIN DBUSUARIO_GRUPO UG ON U.ID_GRUPO = UG.ID_GRUPO
INNER JOIN dbCONTROLE_REGIAO_GRUPO_USUARIO CRGU ON U.ID_GRUPO = CRGU.ID_GRUPO
INNER JOIN dbCLIENTE_REGIAO CR ON CRGU.ID_REGIAO = CR.ID_REGIAO
INNER JOIN DBCLIENTE C ON CR.ID_CLIENTE = C.ID_CLIENTE
WHERE
U.ID_USUARIO = @ID_USR
IF(@FOUND = 1)
SELECT C.FANTASIA, C.ID_CLIENTE
FROM
DBUSUARIO U
INNER JOIN DBUSUARIO_GRUPO UG ON U.ID_GRUPO = UG.ID_GRUPO
INNER JOIN dbCONTROLE_REGIAO_GRUPO_USUARIO CRGU ON U.ID_GRUPO = CRGU.ID_GRUPO
INNER JOIN dbCLIENTE_REGIAO CR ON CRGU.ID_REGIAO = CR.ID_REGIAO
INNER JOIN DBCLIENTE C ON CR.ID_CLIENTE = C.ID_CLIENTE
WHERE
U.ID_USUARIO = @ID_USR
GROUP BY
C.FANTASIA, C.ID_CLIENTE
ORDER BY
C.FANTASIA
ELSE
SELECT
C.FANTASIA, C.ID_CLIENTE FROM DBCLIENTE C
GROUP BY
C.FANTASIA, C.ID_CLIENTE
ORDER BY
C.FANTASIA
这是我的数据来源:
DECLARE @FOUND BIT
DECLARE @REFERENCIA VARCHAR(255)
DECLARE @IDUSR INT
DECLARE @IDPAIS INT
DECLARE @IDESTADO INT
DECLARE @IDCIDADE INT
DECLARE @TIPO INT
SET @REFERENCIA = :REFERENCIA
SET @IDUSR = :ID_USUARIO
SET @IDPAIS = - :ID_PAIS
SET @IDESTADO = :ID_ESTADO
SET @IDCIDADE = :ID_CIDADE
SET @TIPO = :TIPO
SET @FOUND = 0
SELECT @FOUND = 1
FROM
DBUSUARIO U
INNER JOIN DBUSUARIO_GRUPO UG ON U.ID_GRUPO = UG.ID_GRUPO
INNER JOIN dbCONTROLE_REGIAO_GRUPO_USUARIO CRGU ON U.ID_GRUPO = CRGU.ID_GRUPO
INNER JOIN dbCLIENTE_REGIAO CR ON CRGU.ID_REGIAO = CR.ID_REGIAO
INNER JOIN DBCLIENTE C ON CR.ID_CLIENTE = C.ID_CLIENTE
WHERE U.ID_USUARIO = @IDUSR
IF(@FOUND = 1)
SELECT DISTINCT
ISNULL(DBPONTO_TIPO.ICONE, 'APISUL.CGM') ICONE,
DBPONTO.ID_PONTO, DBPONTO.NOME, DBPAIS.DESCRICAO PAIS,
DBESTADO.DESCRICAO ESTADO, DBCIDADE.DESCRICAO CIDADE,
DBPONTO.FONE1, DBPONTO.FONE2, DBPONTO.LATITUDE,
DBPONTO.LONGITUDE, DBPONTO.RAIO, DBPONTO.ENDERECO,
DBPONTO.BAIRRO, DBPONTO.CEP, DBPONTO.STATUS, DBPONTO.ID_CLIENTE,
DBPONTO.ID_TIPO, DBPONTO.HOMOLOGADO, DBPONTO.FLAG,
DBPONTO.CLASSIFICACAO, DBPONTO.ID_CIDADE, DBPONTO.PONTO_GERAL,
DBESTADO.ID_ESTADO, DBPAIS.ID_PAIS, DBPONTO.PERIMETRO,
DS_TIPO_PONTO = CASE WHEN DBPONTO.PERIMETRO = 'P' THEN 'PERIMETRO' ELSE 'PONTO' END,
ID_PONTO_CLASSIFICACAO, C.FANTASIA/*, DBPONTO.ID_CLIENTE, DBPONTO.PONTO_GERAL*/
FROM
DBUSUARIO U
INNER JOIN DBUSUARIO_GRUPO UG ON U.ID_GRUPO = UG.ID_GRUPO
INNER JOIN dbCONTROLE_REGIAO_GRUPO_USUARIO CRGU ON U.ID_GRUPO = CRGU.ID_GRUPO
INNER JOIN dbCLIENTE_REGIAO CR ON CRGU.ID_REGIAO = CR.ID_REGIAO
INNER JOIN DBCLIENTE C ON CR.ID_CLIENTE = C.ID_CLIENTE
LEFT JOIN DBPONTO ON (C.ID_CLIENTE = DBPONTO.ID_CLIENTE)
LEFT JOIN DBPONTO_TIPO ON(DBPONTO.ID_TIPO = DBPONTO_TIPO.ID_TIPO)
LEFT JOIN DBCIDADE ON(DBCIDADE.ID_CIDADE = DBPONTO.ID_CIDADE)
LEFT JOIN DBESTADO ON(DBESTADO.ID_ESTADO = DBCIDADE.ID_ESTADO)
LEFT JOIN DBPAIS ON(DBPAIS.ID_PAIS = DBESTADO.ID_PAIS)
WHERE
(DBPONTO.NOME LIKE @REFERENCIA)
AND (DBPONTO.ID_TIPO > 0)
AND (DBPONTO.CLASSIFICACAO = 1)
AND (DBPAIS.ID_PAIS = @IDPAIS OR @IDPAIS = -1)
AND (DBESTADO.ID_ESTADO = @IDESTADO OR @IDESTADO = -1)
AND (DBCIDADE.ID_CIDADE = @IDCIDADE OR @IDCIDADE = -1)
AND (DBPONTO.ID_TIPO = @TIPO OR @TIPO = -1)
AND (ID_USUARIO = @IDUSR OR DBPONTO.PONTO_GERAL = 1)
UNION
SELECT
ISNULL(DBPONTO_TIPO.ICONE, 'APISUL.CGM') ICONE,
DBPONTO.ID_PONTO, DBPONTO.NOME, DBPAIS.DESCRICAO PAIS,
DBESTADO.DESCRICAO ESTADO, DBCIDADE.DESCRICAO CIDADE,
DBPONTO.FONE1, DBPONTO.FONE2, DBPONTO.LATITUDE,
DBPONTO.LONGITUDE, DBPONTO.RAIO, DBPONTO.ENDERECO,
DBPONTO.BAIRRO, DBPONTO.CEP, DBPONTO.STATUS, DBPONTO.ID_CLIENTE,
DBPONTO.ID_TIPO, DBPONTO.HOMOLOGADO, DBPONTO.FLAG,
DBPONTO.CLASSIFICACAO, DBPONTO.ID_CIDADE, DBPONTO.PONTO_GERAL,
DBESTADO.ID_ESTADO, DBPAIS.ID_PAIS, DBPONTO.PERIMETRO,
DS_TIPO_PONTO = CASE WHEN DBPONTO.PERIMETRO = 'P' THEN 'PERIMETRO' ELSE 'PONTO' END,
ID_PONTO_CLASSIFICACAO, C.FANTASIA
FROM DBPONTO
LEFT JOIN DBPONTO_TIPO ON(DBPONTO.ID_TIPO = DBPONTO_TIPO.ID_TIPO)
LEFT JOIN DBCIDADE ON(DBCIDADE.ID_CIDADE = DBPONTO.ID_CIDADE)
LEFT JOIN DBESTADO ON(DBESTADO.ID_ESTADO = DBCIDADE.ID_ESTADO)
LEFT JOIN DBPAIS ON(DBPAIS.ID_PAIS = DBESTADO.ID_PAIS)
LEFT JOIN DBCLIENTE C ON (DBPONTO.ID_CLIENTE = C.ID_CLIENTE)
WHERE PONTO_GERAL = 1
ORDER BY DBPONTO.NOME
ELSE
SELECT
ISNULL(DBPONTO_TIPO.ICONE, 'APISUL.CGM') ICONE,
DBPONTO.ID_PONTO, DBPONTO.NOME, DBPAIS.DESCRICAO PAIS,
DBESTADO.DESCRICAO ESTADO, DBCIDADE.DESCRICAO CIDADE,
DBPONTO.FONE1, DBPONTO.FONE2, DBPONTO.LATITUDE,
DBPONTO.LONGITUDE, DBPONTO.RAIO, DBPONTO.ENDERECO,
DBPONTO.BAIRRO, DBPONTO.CEP, DBPONTO.STATUS, DBPONTO.ID_CLIENTE,
DBPONTO.ID_TIPO, DBPONTO.HOMOLOGADO, DBPONTO.FLAG,
DBPONTO.CLASSIFICACAO, DBPONTO.ID_CIDADE, DBPONTO.PONTO_GERAL,
DBESTADO.ID_ESTADO, DBPAIS.ID_PAIS, DBPONTO.PERIMETRO,
DS_TIPO_PONTO = CASE WHEN DBPONTO.PERIMETRO = 'P' THEN 'PERIMETRO' ELSE 'PONTO' END,
ID_PONTO_CLASSIFICACAO, DBCLIENTE.FANTASIA
FROM
DBPONTO
LEFT JOIN DBCLIENTE ON (DBPONTO.ID_CLIENTE = DBCLIENTE.ID_CLIENTE)
LEFT JOIN DBPONTO_TIPO ON(DBPONTO.ID_TIPO = DBPONTO_TIPO.ID_TIPO)
LEFT JOIN DBCIDADE ON(DBCIDADE.ID_CIDADE = DBPONTO.ID_CIDADE)
LEFT JOIN DBESTADO ON(DBESTADO.ID_ESTADO = DBCIDADE.ID_ESTADO)
LEFT JOIN DBPAIS ON(DBPAIS.ID_PAIS = DBESTADO.ID_PAIS)
WHERE
((DBPONTO.NOME LIKE @REFERENCIA)
AND (DBPONTO.ID_TIPO > 0)
AND (DBPONTO.CLASSIFICACAO = 1)
AND (DBPAIS.ID_PAIS = @IDPAIS OR @IDPAIS = -1)
AND (DBESTADO.ID_ESTADO = @IDESTADO OR @IDESTADO = -1)
AND (DBCIDADE.ID_CIDADE = @IDCIDADE OR @IDCIDADE = -1)
AND (DBPONTO.ID_TIPO = @TIPO OR @TIPO = -1))
UNION
SELECT
ISNULL(DBPONTO_TIPO.ICONE, 'APISUL.CGM') ICONE,
DBPONTO.ID_PONTO, DBPONTO.NOME, DBPAIS.DESCRICAO PAIS,
DBESTADO.DESCRICAO ESTADO, DBCIDADE.DESCRICAO CIDADE,
DBPONTO.FONE1, DBPONTO.FONE2, DBPONTO.LATITUDE,
DBPONTO.LONGITUDE, DBPONTO.RAIO, DBPONTO.ENDERECO,
DBPONTO.BAIRRO, DBPONTO.CEP, DBPONTO.STATUS, DBPONTO.ID_CLIENTE,
DBPONTO.ID_TIPO, DBPONTO.HOMOLOGADO, DBPONTO.FLAG,
DBPONTO.CLASSIFICACAO, DBPONTO.ID_CIDADE, DBPONTO.PONTO_GERAL,
DBESTADO.ID_ESTADO, DBPAIS.ID_PAIS, DBPONTO.PERIMETRO,
DS_TIPO_PONTO = CASE WHEN DBPONTO.PERIMETRO = 'P' THEN 'PERIMETRO' ELSE 'PONTO' END,
ID_PONTO_CLASSIFICACAO, C.FANTASIA
FROM DBPONTO
LEFT JOIN DBPONTO_TIPO ON(DBPONTO.ID_TIPO = DBPONTO_TIPO.ID_TIPO)
LEFT JOIN DBCIDADE ON(DBCIDADE.ID_CIDADE = DBPONTO.ID_CIDADE)
LEFT JOIN DBESTADO ON(DBESTADO.ID_ESTADO = DBCIDADE.ID_ESTADO)
LEFT JOIN DBPAIS ON(DBPAIS.ID_PAIS = DBESTADO.ID_PAIS)
LEFT JOIN DBCLIENTE C ON (DBPONTO.ID_CLIENTE = C.ID_CLIENTE)
WHERE PONTO_GERAL = 1
ORDER BY DBPONTO.NOME
数据字段:ID_CLIENTE
关键字段:ID_CLIENTE
列表字段:FANTASIA
我有一个例外,说:“试图修改只读字段”
答案 0 :(得分:0)
要使DBLookupComboBox为目标数据源分配值,数据源需要是可更新的。数据源查询看起来很复杂,其中有UNIONS。因此,无法自动计算匹配的插入/更新语句,Delphi会只读取数据源及其字段。因此,当您使用组合框更改它时,无法修改该值,并且您收到错误。
我认为您应该简化数据源查询以使用最多一个简单表作为源,或者手动为查询提供匹配的插入和更新语句。