在一对\DTLnewrow
/之后\DTLnewdbentry
,创建了两行数据key1
,我想将key2
数据添加到前一行。我以为这\dtlgetrow{myDB}{1}
会将当前行设为带有 的行rowid=1
,但事实并非如此,因为数据只是添加到了第二行。
下面的 MWE 得出:
问题:我应该用什么来代替 ,\dtlgetrow{myDB}{1}
以便获得xprime
和NULL
交换的结果。基本上,我如何选择哪一行是后续操作的当前行?
笔记:
- 一个简单的解决方案是改变执行这些操作的顺序,但我无法轻易做到这一点。
代码:
\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}