0

我对 PowerBuilder Classic 12 相当陌生。我需要检查记录是否可用,如果没有则从文本框中插入。我可能需要一个 DataStore,因为有人建议使用 SQL 语句。谢谢。这段代码的行为很有趣,请问问题出在哪里?有一次它可以工作,但再次运行程序它会接受已经插入的数据。该程序没有给出任何错误,但我可以看到存储在表中的相同数据。

string id, idno
 idno=trim(sle_idno.text)
 if idno="" then
    messagebox("EMPTY","Enter a record")
        return
end if
   SELECT employee.idnumber
    INTO :id  
    FROM employee  ; 
     if idno=id then
        messagebox("AVAILABLE","Record available")
        return
    end if
  INSERT INTO employee 
         ( idnumber )  
  VALUES ( :idno )  ;
4

2 回答 2

2

修复现有代码

您缺少 WHERE 子句;这是试图将所有 idnumber 值填充到 id 中。这就是您现有代码失败的原因。

查看 PB 附带的帮助文件。(附带的 PDF 手册也很好,但帮助文件就在 IDE 的菜单上。)那里有很多关于如何编写嵌入式 SQL 语句的示例。您应该检查事务对象的错误属性(在这种情况下它是隐式 SQLCA)以确定事务是否成功执行,是否返回任何行等......

一种新方法

有几种方法可以使用 DataStore 来解决这个问题。最简单的方法是针对employee 表创建一个DataWindow 对象,该对象接受一个参数并在WHERE 子句的SQL 语句中使用它。在您的脚本中,使用此对象设置 DataStore 并使用 idnumber 作为参数对其进行 Retrieve(),检查 Retrieve() 的返回值(返回的行数,如果为正或为零,如果为负,则返回错误)以及是否为零,InsertRow() 在您的 DataStore 上,在其上执行您的 SetItem()(您需要加载的不仅仅是 idnumber,对吗?),然后对其执行 Update()。

于 2012-07-15T02:54:28.667 回答
1

您正在寻找合并

我将用一个例子来解释它。只需通过存储过程发送数据库中的值?并使用以下技术。

示例 DDL

CREATE TABLE Employee
(
   EmployeeID INTEGER PRIMARY KEY,
   EmployeeName VARCHAR(15)
)

CREATE TABLE EmployeeSalary
(
    EmployeeID INTEGER ,
    EmployeeSalary INTEGER
)

员工 DML 示例

INSERT INTO Employee
VALUES(1,'SMITH')
INSERT INTO Employee
VALUES(2,'ALLEN')
INSERT INTO Employee
VALUES(3,'JONES')
INSERT INTO Employee
VALUES(4,'MARTIN')
INSERT INTO Employee
VALUES(5,'JAMES')
Sample DML For EmployeeDetails

INSERT INTO EmployeeSalary
VALUES(1,23000)
INSERT INTO EmployeeSalary
VALUES(2,25500)
INSERT INTO EmployeeSalary
VALUES(3,20000)

合并查询

MERGE EmployeeSalary AS stm
USING (SELECT EmployeeID,EmployeeName FROM Employee) AS sd
ON stm.EmployeeID = sd.EmployeeID
WHEN MATCHED THEN UPDATE SET stm.EmployeeSalary = stm.EmployeeSalary + 12
WHEN NOT MATCHED THEN
INSERT(EmployeeID,EmployeeSalary)
VALUES(sd.EmployeeID,25000);

参考

第一参考

第二参考

第三参考

第四参考

于 2012-07-15T10:41:29.107 回答