【发布时间】:2018-08-21 20:53:28
【问题描述】:
编辑:请在下面找到我的解决方案
我在一个表格中有两个选择框,我从两个不同的表中填充。 SELECT1 显示客户特定的选项。 SELECT2 显示所有可用选项,除了那些已经在 SELECT1 上的选项
填充它们,将项目从一个移动到另一个等一切正常。
我不知道如何在提交 FORM 后将 SELECT1 的那些项目存储回数据库。 对于该 SELECT 框中的每个项目,我需要检查它是否已存在于 MY_TABLE_2 中,如果不存在,则将其存储。
当我检查 var_dump(SELECT1) 时,我只看到最后一个选定项目的值,但它通常在 SELECT1 中包含多个项目。
现在我正在为将在 MY_TABLE_1 上进行的所有其他字段调用存储过程,这没关系。 如果出现错误,我将需要执行一些更新两个表或回滚的事务。如果我只存储一件物品,那就可以了。
但是我如何将所有项目发送到存储过程。
有什么帮助或线索吗?
如果可以帮助理解,这里是一个打印屏幕:
生成表单的代码:
echo '<select name="ed_clilabelcodes" id="ed_clilabelcodes" style="width: 200px" multiple>';
while($row = sqlsrv_fetch_array($dvclilablist)){
echo '<option value="'.$row[0].'">'.$row[0].' - '.$row[1].'</option>';
}
echo '</select>';
-----------我的解决方案-----------
任何这些选择框中的所有项目都存在于由字段 OptCode 标识的表 (dbo.MyItems) 中。 我真正需要的是存储那些由特定客户选择的物品。 我正在考虑使用第二张表来存储这些项目,但实际上我是在复制信息,我认为这不是最好的解决方案。
由于我真的只需要附加到客户端文件的那些选定代码,因此我执行了以下操作:
我有一个受HERE 启发的javascript 函数,它允许我在两个选择框之间移动项目,顺便说一下,从HERE 创建一个对框中的项目进行排序的函数。 每次我从客户端的列表框中添加或删除项目时,我都会立即调用排序函数,因此我只需使用选择框中的所有项目值(代码)更新隐藏的输入值,然后立即调用此 javascript 函数:
function RecheckCodes() {
var vlist = document.getElementById("ed_clilabelcodes");
var vlabcodes = "";
var i;
for (i = 0; i < vlist.length; i++) {
if (i == 0) {
vlabcodes = vlabcodes + "\'" + vlist.options[i].value + "\'";
}
else {
vlabcodes = vlabcodes + ",\'" + vlist.options[i].value + "\'";
}
}
document.getElementById("v_clilabcodes").value = vlabcodes;
}
在 FORM Post 上,我只是将该字符串保存在客户端字段中。
之后我可以使用以下 2 个存储过程重新填充框以进行编辑以获取项目(第一个 SQL 将获取带有代码的字符串,并从第二个从项目表中获取项目描述的 SQL 调用)。
ALTER PROCEDURE [dbo].[DavGetOptCodeByClient]
@vclicode nvarchar(12),
@vopttype nvarchar(12),
@voptcodes nvarchar(300) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @voptcodes = optcodes
FROM dbo.dav_client_options
WHERE clinumber = @vclicode AND opttype = @vopttype
END
ALTER PROCEDURE [dbo].[DavGetOptDetailByClient]
@vclicode nvarchar(12),
@vopttype nvarchar(12)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @v2optcodes nvarchar(1000)
DECLARE @vsql nvarchar(1000)
exec dbo.DavGetOptCodeByClient @vclicode,@vopttype, @v2optcodes OUTPUT
SET @vsql = 'SELECT optcode, optdetail ' +
'FROM dbo.dav_global_options ' +
'WHERE ("optcode" IN ('+@v2optcodes+')) AND (opttype = '''+@vopttype+''')'
EXEC sp_executesql @vsql
END
所以即使我确信可以对代码进行一些改进,一切都可以满足我的需要。
【问题讨论】:
-
您可以使用表值参数,或者不太理想的方法是为列表中的每个项目调用您的过程。
-
一个图像可能会说一千多个单词。可能。在这种情况下,我更喜欢生成表单的 php 和处理发布数据的 php。
-
也许您可以复制两个表中的所有项目,在两个表中添加一个数量列。然后你可以只改变数量 - 它应该更容易。您也可以只使用一个表来完成此任务,将 Select# 列添加到其中。如果两个选择不能有相同的值,您可以简单地更改每个值的 Select# ID。
-
@GerardH.Pille,将处理将“客户端标签”框中的这 3 个元素传递给存储过程的 php 是我也在寻找的那个。其余所有工作正常。我在玩使用 javascript 的想法,我必须将项目从一个盒子移动到另一个盒子,让它将所有项目值提供给一个 var,用逗号分隔,然后将它发送到 SQL 存储过程,但是有没有办法然后将其拆分为每个单独的代码并读取“所有标签”表中的每个元素并将它们插入到 MY_TABLE_2?
-
可以使用分隔数据。你用的是什么版本的sql server?
标签: php html sql-server