【问题标题】:PowerApps: How to Patch multiple SQL tables with foreign keys?PowerApps:如何使用外键修补多个 SQL 表?
【发布时间】:2019-03-17 05:57:41
【问题描述】:

尝试在 PowerApps 中对表使用 Patch 函数时遇到 SQL INSERT 错误,该表具有依赖于尚未修补的第二个表的主键的外键。

这是有道理的。如何允许我修补具有空白依赖项的表?那么如何实现呢?

以下是所有 5 个表的 FK/PK 依赖关系:

到目前为止我已经尝试过:

  • 在 FK 列上允许 NULL
  • 从 FK UPDATE 和 DELETE 中删除了 CASCADE

还有什么想法吗?我特别需要示例函数。 谢谢

【问题讨论】:

    标签: foreign-keys azure-sql-database powerapps powerapps-formula


    【解决方案1】:

    Patch function 将返回已更新(或插入)的对象,其中填写了服务器中的任何字段,因此您可以使用存储它并稍后使用它来检索服务器生成的 id。使用Last 在大多数情况下都可以使用,但如果您同时在应用程序中有两个用户,或者如果表开始变得太大(并且并非所有这些都将一次在本地缓存),则可能会失败。

    Set(
        patchResult,
        Patch(
            '[dbo].[dateTable]',
            Defaults('[dbo].[dateTable]'),
            {
                siteId: varSiteID,
                readingDate: Now()
            }));
    
    //Patch values into readingTable
    
    Patch(
        '[dbo].[readingTable]',
        Defaults('[dbo].[readingTable]'),
        {
            dateId: patchResult.dateId,
            unitNum: 1, 
            xzyName: 1,
            avgJJk: 1,
            prevLLk: 1,
            readingNotes: "This is awesome"
        }
    );
    

    【讨论】:

    • 感谢@carlosfigueira 的精彩见解。当两个用户同时在应用程序中时,我没有想到会产生什么影响。当你说“......或者如果桌子太大了。”您指的是使用 Last() 时的委托问题吗?
    • 这种模式会持续超过 1 个“级联”补丁吗?示例:如果我有另一个表依赖于 readingTable 的 PK,我是否会将 readingTable Patch 保存为变量并在类似的函数中调用它?
    • 对于第一个问题 - 是的,Last 尚未授权,因此您可能会遇到问题。对于第二个 - 再次是的,如果您有第三个表的 FK 到 readingTable,那么您可以将插入结果存储到其中以供以后使用。
    【解决方案2】:

    刚想出来这个:

    您必须先修补这些,以便首先修补 PK,然后通过 Last() 函数抓取并插入(作为 FK)到后续修补程序中。

    希望这对其他人有所帮助。

    示例

    //Patch values into dateTable
    
    Patch('[dbo].[dateTable]',
        Defaults('[dbo].[dateTable]'),
            {
                siteId: varSiteID,
                readingDate: Now()
            }
    );
    
    //Patch values into readingTable
    
    Patch('[dbo].[readingTable]',
        Defaults(
            '[dbo].[readingTable]'),
            {
                dateId: Last('[dbo].[dateTable]').dateId, <--BINGO
                unitNum: 1, 
                xzyName: 1,
                zyxNum: 1,
                xkdFactor: 1, 
                supplyXya: 1, 
                supplyUio: 1, 
                sortNum: 1,
                currentUys: 1,
                avgJJk: 1,
                prevLLk: 1,
                readingNotes: "This is awesome"
            }
    );
    
    //Patch values into the imageTable
    
    ForAll(
        colImageGallery,
        Patch(
            '[dbo].[imageTable]',
                Defaults('[dbo].[imageTable]'),
            {
                readingId: Last('[dbo].[readingTable]').readingId, <--BINGO
                photo: image,
                photoNotes: " "
            }
        )
    );
    

    【讨论】:

    • 请不要使用Last(),见carlosfiguera下面的帖子
    • 注意到了,谢谢@Meneghino。我会在上面留下我不正确的回复,以便人们进行比较。保重!
    猜你喜欢
    • 2021-02-02
    • 2014-09-18
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多