DbLookUpComboBox不允许选择项目

时间:2014-02-06 12:01:28

标签: delphi combobox datasource

我已经使用组件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

我有一个例外,说:“试图修改只读字段”

1 个答案:

答案 0 :(得分:0)

要使DBLookupComboBox为目标数据源分配值,数据源需要是可更新的。数据源查询看起来很复杂,其中有UNIONS。因此,无法自动计算匹配的插入/更新语句,Delphi会只读取数据源及其字段。因此,当您使用组合框更改它时,无法修改该值,并且您收到错误。

我认为您应该简化数据源查询以使用最多一个简单表作为源,或者手动为查询提供匹配的插入和更新语句。