【问题标题】:Coldfusion structure and/or arrays to organize some dataColdfusion结构和/或数组来组织一些数据
【发布时间】:2012-01-03 16:43:15
【问题描述】:

创建一个生日俱乐部。

数据库由客户及其宠物组成。一些客户可能只有 1 只宠物,而其他客户可能有 10 只。Clients 存储在一个表中,Pets 存储在另一个表中,client_id 相应地作为主键和外键。

该网页将显示数百名客户和他们的宠物,但我们将专注于一个名为 John Doe 的虚拟记录。现在,假设 John Doe 有一只狗、一匹马和一只猫。狗和猫在一月过生日,马在三月过生日。当我查看网页时,我可以看到 John 的猫和狗,输入框被选中,但马没有(因为他的生日是三月而不是一月)。我单击“继续”按钮,将生成一封电子邮件给 John,祝他的狗和猫生日快乐,但我不想包括马。他将在三月份收到另一封关于马的电子邮件,但不会收到猫的电子邮件。到目前为止和我在一起?

现在,我的表单,我有这样的设置:

<cfset ClientPet = ArrayNew(2)>  
<cfoutput>  
<cfset x = 1>  
<cfloop index="p" list="#select_pet#" delimiters=",">  
Client ID: #listfirst(p,'|')#<br />  
Pet ID: #listlast(p,'|')#  
<cfset ArrayAppend(ClientPet[x][1], '#listfirst(p,'|')#')>  
<cfset ArrayAppend(ClientPet[x][2], '#listlast(p,'|')#')>  
</cfloop>  
</cfoutput>

在操作页面上,我只想向客户发送一封电子邮件并动态列出他们的宠物,但只列出从上一页中选择的宠物,所以我这样做:

<cfset ClientPet = ArrayNew(2)>  
<cfoutput>  
<cfset x = 1>  
<cfloop index="p" list="#select_pet#" delimiters=",">  
Client ID: #listfirst(p,'|')#<br />  
Pet ID: #listlast(p,'|')#  
<cfset ArrayAppend(ClientPet[x][1], '#listfirst(p,'|')#')>  
<cfset ArrayAppend(ClientPet[x][2], '#listlast(p,'|')#')>  
</cfloop>  
</cfoutput>

我不知道我是否应该使用数组或结构,无论我使用哪种方式,我都需要能够遍历所有的 client_id,然后是所有的宠物,然后是下一个 client_id 和他们所有的宠物, 等等。我在上面的正确道路上吗?如果是这样,我应该能够遍历我的二维数组或结构,然后相应地系统地列出宠物,对吧?

【问题讨论】:

  • 目标是创建一封电子邮件给所有希望本月宠物生日快乐的客户吗?你为什么要显示复选框?这是计划任务吗?
  • @NathanStanford - 如果她不希望客户收到电子邮件通知(例如,宠物通过了,她只是尚未将宠物标记为已故),我的客户想要取消选中复选框。
  • @NathanStanford - 你是来自 EasyCFM 的 Nathan 吗?

标签: arrays coldfusion structure


【解决方案1】:

正如 Nathan 所建议的,这可能是计划任务而不是手动表单的更好候选者。

.. 但是要解决有关数组和结构的问题.. 听起来你不需要任何一个。只需将复选框值设为petid 值即可。

<input name="select_pet" type="checkbox" value="#petID#">

提交表单后,该字段将包含所选宠物 ID 的列表。只需将该列表输入到查询中即可检索客户和宠物信息。

   SELECT  c.client_name, p.pet_id, p.pet_name
   FROM    pet p INNER JOIN clients c ON c.client_id = p.client_id
   WHERE   p.pet_id IN 
   ( 
      <cfqueryparam value="#form.select_pet#" list="true" cfsqltype="cf_sql_integer"> 
   )

【讨论】:

  • 这就是我们最终选择的路线。我让这种方式变得比必要的更难。我不确定为什么我认为我也需要传递 client_ID,但你是 100% 正确的,我只需要查找 client_id,因为我有 petID。使用群组:SELECT p.id, p.pet_name, p.pet_dob, c.client_id, c.fn, c.ln, c.email FROM vet_release_pets AS p INNER JOIN customer AS c ON p.vet_release_key = c.client_key GROUP BY p.id, p.pet_name, p.pet_dob, c.client_id, c.fn, c.ln, c.email HAVING (p.id IN (#select_pet#)) ORDER BY c.client_id
  • 我正在使用计划任务设置电子邮件以提醒我的客户出去运行报告。 :)
  • (编辑)我不确定报告 :) 但是自动发送电子邮件会不会更容易 - 不需要人工干预?关于 sql,在WHERE 子句中过滤通常更有效,而不是HAVING。请务必使用cfqueryparam list=true。看起来您也可以消除 GROUP BY,因为没有聚合。
  • 哦,别管第一部分了。我从上面的后续 cmets 中看到,您需要在发送电子邮件之前进行最终“审查”。
猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多