The condition "if idn == `i'" is not only illegal,
but in any case irrelevant to the -display-.
It should just be omitted. That is, the -correlate-
command already took care of the restriction
you want, and there is only one correlation
available to display, so no ambiguity.

Unfortunately, omitting the second "if" condition does not produce
what I am looking for: since there are t observations for each id, t >
count(id) = 50, the first id is shown 50 times along with the
(otherwise correct) correlation coefficients. Given the solutions
below, I'm not going to spend more time on this now....

As it happens, there are other solutions. Here
are two:
* The -egenmore- package on SSC includes a -corr()-
function, so that I think you need something like
egen corr = corr(x y), by(id)
tabdisp id, c(corr)

This does work, although the way -tabdisp- handles missing values
initially had me confused. One of the series is missing observations
at the beginning of the (time series) sample, so the initial values of
"corr" where missing; -tabdisp- shows these values -- as blanks.
Instead,

tabdisp id if ~missing(corr), c(corr)

did the trick.

* -statsby- offers an even simpler solution,
but you lose your data. That may or may not be
what you want.
statsby "corr x y" corr=r(rho) , by(id)

Thanks, this works quite nicely! (I can always use the "saving"
option and then re-use my prior datafile.)