如何选择 \DTLnewdbentry 所应用的特定行

如何选择 \DTLnewdbentry 所应用的特定行

在一对\DTLnewrow/之后\DTLnewdbentry,创建了两行数据key1,我想将key2数据添加到前一行。我以为这\dtlgetrow{myDB}{1}会将当前行设为带有 的行rowid=1,但事实并非如此,因为数据只是添加到了第二行。

下面的 MWE 得出:

在此处输入图片描述

问题:我应该用什么来代替 ,\dtlgetrow{myDB}{1}以便获得xprimeNULL交换的结果。基本上,我如何选择哪一行是后续操作的当前行?

笔记:

  • 一个简单的解决方案是改变执行这些操作的顺序,但我无法轻易做到这一点。

代码:

\documentclass{article}
\usepackage{datatool}

\begin{document}
\DTLnewdb{myDB}

\DTLnewrow{myDB}% create first row
\DTLnewdbentry{myDB}{key1}{x}

\DTLnewrow{myDB}% create second row
\DTLnewdbentry{myDB}{key1}{y}

\dtlgetrow{myDB}{1}% ????? Thought this would make row 1 the current row

\DTLnewdbentry{myDB}{key2}{xprime}% This needs to be in the first row
\DTLdisplaydb{myDB}
\end{document}

答案1

\dtlgetrow获取给定的行并将其存储在当前令牌寄存器中\dtlcurrentrow。只有手册的“操作当前行”部分中列出的命令才会影响此寄存器。这些命令修改令牌寄存器而不是数据库。修改完成后,您可以使用将更改合并回数据库\dtlrecombine

\documentclass{article}
\usepackage{datatool}

\begin{document}
\DTLnewdb{myDB}

\DTLnewrow{myDB}% create first row
\DTLnewdbentry{myDB}{key1}{x}

\DTLnewrow{myDB}% create second row
\DTLnewdbentry{myDB}{key1}{y}

\dtlgetrow{myDB}{1}% store row 1 in \dtlcurrentrow register
\dtlappendentrytocurrentrow{key2}{xprime}% make local modification to current row
\dtlrecombine% merge modification into database.

\DTLdisplaydb{myDB}

\end{document}

这是编辑数据库中特定行的最有效方法。

答案2

在此处输入图片描述

我不明白为什么你不能只输入\value{DTLrowi}=1可选参数来过滤行,但这会产生错误,但这是有效的:

\documentclass{article}
\usepackage{datatool}

\begin{document}
\DTLnewdb{myDB}

\DTLnewrow{myDB}% create first row
\DTLnewdbentry{myDB}{key1}{x}

\DTLnewrow{myDB}% create second row
\DTLnewdbentry{myDB}{key1}{y}

\DTLforeach{myDB}{}{%
\ifnum\value{DTLrowi}=1
\DTLappendtorow{key2}{xprime}% This needs to be in the first row
\fi
}

\DTLdisplaydb{myDB}
\end{document}

相关内容