【问题标题】:Filemaker: values form related tableFilemaker:值表相关表
【发布时间】:2015-08-02 08:03:01
【问题描述】:

我有 2 个表,DATAIMAGES,它们的关系基于 item_numberDATA 中的每条记录都收集了来自IMAGES 的 3 条记录。

例如,item_number 010050 的记录链接到IMAGES 中的这些记录:

  • 010050.eps
  • 010050_table.tif
  • 010050_drawing.png

在 DATA 的相应记录中,我有以下字段:

  • main
  • table
  • drawing

我的目标是在 DATA 中设置字段,例如:

  • 010050.eps => 主要
  • 010050_table.tif => 表格
  • 010050_drawing.png => 绘图

我试过了:

ExecuteSQL("SELECT filename FROM images WHERE filename = ?"; ""; ""; "010050_drawing")

谁能给个提示?

【问题讨论】:

  • 为什么需要这些额外的字段?您可以简单地在 portal 中显示相关记录 - 如有必要,使用计算标签(可能基于文件的扩展名?)。
  • 您的 SQL 查询不起作用,因为您的参数最后缺少“.png”,所以它不会匹配,但正如这里大家提到的,我不确定您的方法是否正确

标签: filemaker


【解决方案1】:

我不知道如何在 xslt 中做到这一点。

举个简单的例子,假设您从Data 表中导出,导出中只包含两个字段:Data::ItemNumberImages::FileName。您的原始导出将如下所示(显示两条记录):

XML

<?xml version="1.0" encoding="UTF-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
   <ERRORCODE>0</ERRORCODE>
   <PRODUCT BUILD="" NAME="FileMaker" VERSION=""/>
   <DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/>
   <METADATA>
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ItemNumber" TYPE="NUMBER"/>
      <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Images::FileName" TYPE="NUMBER"/>
   </METADATA>
   <RESULTSET FOUND="2">
      <ROW MODID="0" RECORDID="1">
         <COL>
            <DATA>010050</DATA>
         </COL>
         <COL>
            <DATA>010050.eps</DATA>
            <DATA>010050_table.tif</DATA>
            <DATA>010050_drawing.png</DATA>
         </COL>
       </ROW>
      <ROW MODID="0" RECORDID="2">
         <COL>
            <DATA>2345</DATA>
         </COL>
         <COL>
            <DATA>2345_extra.gif</DATA>
            <DATA>2345_table.gif</DATA>
            <DATA>2345_drawing.jpg</DATA>
            <DATA>2345.tiff</DATA>
         </COL>
      </ROW>
   </RESULTSET>
</FMPXMLRESULT>

注意不同的顺序以及第二条记录中的额外图像。

应用以下样式表后:

XSLT

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
exclude-result-prefixes="fmp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <root>
        <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
            <xsl:variable name="item-no" select="fmp:COL[1]/fmp:DATA"/>
            <item>
                <number>
                    <xsl:value-of select="$item-no"/>
                </number>
                <main>
                    <xsl:value-of select="fmp:COL[2]/fmp:DATA[starts-with(., concat($item-no, '.'))]"/>
                </main>
                <table>
                    <xsl:value-of select="fmp:COL[2]/fmp:DATA[starts-with(., concat($item-no, '_table.'))]"/>
                </table>
                <drawing>
                    <xsl:value-of select="fmp:COL[2]/fmp:DATA[starts-with(., concat($item-no, '_drawing.'))]"/>
                </drawing>
            </item>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

你会得到:

结果

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item>
      <number>010050</number>
      <main>010050.eps</main>
      <table>010050_table.tif</table>
      <drawing>010050_drawing.png</drawing>
   </item>
   <item>
      <number>2345</number>
      <main>2345.tiff</main>
      <table>2345_table.gif</table>
      <drawing>2345_drawing.jpg</drawing>
   </item>
</root>

【讨论】:

  • 这非常有帮助!这是向前迈出的一大步。简单得多。我刚刚发现 item_number 并不像我最初想象的那样总是有 6 个位置。如果我将使用这种方法,它也使我免于解决这个问题。谢谢你的帮助!
【解决方案2】:

老实说,除非发生的事情比你所描述的更多,否则你把这件事弄得太难了。

如果每个 DATA 记录总是恰好有 3 个 IMAGE 记录,尤其是如果您想将每个图像直接关联到特定类型,则不需要 IMAGE 表。一个更简单的解决方案是将 3 个容器字段添加到您的 DATA 表(例如,main_image、table_image、drawing_image)。您不需要 SQL 或门户,也不必担心保持相关图像与其类型相关联。

OTOH,如果您真的需要一个单独的表格,请考虑硬连线三个专用的 1:1 关系,每个图像类型一个。为此,在 DATA 中添加 3 个特殊关键字段:(main_image_id 等)并为每种图像类型创建关系,每个在这些字段之一和主图像之间。然后,每当您创建一个 DATA 记录和 3 个相关的 IMAGE 记录时,将匹配图像的键放在匹配的 DATA::xxx_image_id 字段中。这样,您将拥有清晰的 1:1 关系,并且每个相关图像都将被锁定为其类型。

【讨论】:

  • Brian,OP已经有了工作关系,可以通过它获取数据。为什么他还需要三个 1:1?
  • Nicolai,听起来每条 DATA 记录正好有 3 张图像,并且每张都需要锁定为匹配的类型。标准关系可以对相关记录进行排序,但这是锁定 3 个相关图像记录中的每一个的弱方法;如果第一个或第二个被删除等怎么办? 1:1 关系是将 IMAGE 数据存储在单独的表中的一种方式,同时保持每个相关图像干净地锁定到其类型。
【解决方案3】:

感谢您的回复

我需要这些字段中图像的值才能将其导出到 XML 和 InDesign(到表格单元格中)。
问题是我知道文件名,即 item_number 后跟 _drawing 或 _table,但不知道正手的扩展名(许多文件和来自不同来源) 因此文件格式不同。
我现在的解决方案是:
- 导入相关(item_number,他的也是文件名的一部分)FMP 表中的所有图像
- 我计算了文件是表格、绘图还是插图,并将这些值放在“种类”字段中:

Case (
  PatternCount ( filename ; "_drawing." )  ;
  "drawing" ;

  PatternCount ( filename ; "_table." ) ;
  "table" ;

  Length ( filename )=10 ;
  "main" ;

  ""
)


- 然后我在每个字段中进行查询,主 - 表 - 绘图。下面是“表格”字段中的计算。

ExecuteSQL("
  SELECT path_xml 
  FROM images 
  WHERE item_number = ? and kind = ?";
  "";""; item_number ; "table"); ""
) 


可能有点笨拙,但现在可以了。

【讨论】:

  • "我需要这些字段中图像的值才能将其导出为 XML" 仅供参考,当您导出时,您可以在导出字段顺序中包含相关字段。如果文件的唯一目的是为另一个应用程序提供服务,则无需将 anything 添加到文件的架构中。所有逻辑都可以由 XSLT 样式表(您可能拥有)处理。
  • 谢谢,我想到了。每个图像文件都需要放入 ID 表中的专用单元格中。 EG: 123456_drawing.eps 进入单元格中的单元格,用于包含图纸。我不知道如何在 xslt 中做到这一点。我可能会让生活更轻松,获得更清洁、更精简的 FMP 表也是一个优势。
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多